题目来源:点击打开链接
以下代码的运行结果为:
class Base {
public:
Base() {echo();}
virtual void echo() {printf(“Base”);}
};
class Derived:public Base {
public:
Derived() {echo();}
virtual void echo() {printf(“Derived”);}
};
int main() {
Base* base = new Derived();
base->echo();
return 0;
}
答案:
Base
Derived
Derived
分析思路:要构造Derived必须先构造Base,然后再调用Derived的echo。
参考链接: 点击打开链接
以下图示更能描述默认继承和虚拟继承的区别.
默认继承:
base base
| |
| |
Mid1 Mid2
| |
|
Child
存在两个类体系是出错的原因.
虚拟继承:
base
|
| |
Mid1 Mid2
| |
|
Child
使用虚拟继承将类的体系整合起来.
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
父类构造函数里不能调用虚函数,因为虚函数是运行时调用确定的,父类对象会调用子类函数,这样会出问题