|
楼主 |
发表于 2021-3-8 22:30:02
|
显示全部楼层
看来我语言表达能力确实有待加强 -_-b
书上写的基类的构造函数和析构函数派生类不能继承!
我再问(哎~~ ):
为什么 若没有virtual,delete p;就少调用一个析构函数?
我是这样理解virtual的:
派生类能继承来自父类除构造函数和析构函数外所有的成员和函数,如:
class Base
{
public:
Base();
~Base(){cout<<"Destructor Base!";};
virtual void Out1(){cout<<"In the Base!(Out1)";};
void Out2(){cout<<"In the Base!(Out2)";};
private:
int x;
int y;
}
class Derived:public Base
{
public:
Derived(int z);
~Derived(){cout<<"Destructor Derived";};
virtual void Out1(){cout<<"In the Derived!(Out1)";};
void Out2(){cout<<"In the Derived!(Out2)";};
void Out3(){cout<<"In the Derived!(Out3)";};
private:
int z;
};
int main()
{
Base bb,*p;
Derived dd(123);
*p=bb;
*p->Out1(); //In the Base!(Out1)
*p->Out2(); //In the Base!(Out2)
*p=dd;
*p->Out1(); //In the Derived!(Out1)
*p->Out2(); //In the Base!(Out2)
delete p;
return 0;
};
上面的Derived继承了Base的除
Base(); ~Base();
两个函数外所有的成员(x,y)和函数(Out1,Out2),当此时我定义一个基类的指针去访问派生类对像来实现多态,但由于是基类的指针,所以只能访问派生类继承自基类的函数(如Out1,此时在Derived中的Out2前没有加virtual虽然它的名子和Base的Out2相同,但在Derived中被Derived的Out2隐藏掉),不能访问Derived自己新定义的函数(如:Out2,Out3,当然也包括Dervied 的构造函数与析构函数).
好了,既然*p能访问派生类的Out1又可以访问基类的Out1,就可以为*p赋不同的对像(bb,dd)来调用不同对像的Out1,实现多态.
但对于Out2就不行了,因为虽然*p=bb 指向的是派生类的对像,*p->Out2();原意是想调用派生类的Out2但由于Out2是派生类中新加入的函数,用基类的指针不能访问,所以当我用*p->Out2();时编译器就会在派生类中找到那个被隐藏起来的从基类继承下来的同名函数Out2();
下面的理解感觉有问题!!!!
与上面Out2()的道理相似,当我调用 delete p;时由于p是基类类型的指针,虽然它现在指向派生类对象,但它在派生类中找不到从基类中继承下来的析构函数(构造函数与析构函数不能被继承)而~Derived()又是派生类新的函数,基类指针无权访问,就谈不上调用了,delete p;只能跳过这个析构函数,调用基类的析构函数(此时,由于z是派生类中的成员,调用基类的析构函数不能释放z的空间!造成了错误)
而当我在基类的析构函数前加上virtual后......派生类中又没有同名的析构函数,加它有什么用,但好像析构函数不要求同名..... 乱了乱了,后面的就不知道了
1>>>>我上面理解的对不对?
2>>>>为什么 若没有virtual,delete p;就少调用一个析构函数?
3>>>>为什么若有virtual,delete p;就调用两个析构函数?
谢谢各位了,写的比较多,因为很想知道里面究竟背着我发生了什么
|
|