#include "stdafx.h"
#include <iostream>
using namespace std;
class Father {
public:
virtual void func() {
cout << "Father" << endl;
}
//virtual void func() = 0;
};
class Mather {
public:
void func() {
cout << "Mather" << endl;
}
};
class Child :public Father, public Mather {
//public:
//<span style="white-space:pre"> </span>void func() {
//<span style="white-space:pre"> </span>cout << "Child" << endl;
//<span style="white-space:pre"> </span>}
};
int main()
{
Father* f;
Mather* m;
Child* c, child;
f = c = &child;
m = c;
f->func();
m->func();
//c->func();
//child.func();
return 0;
}
对于func函数而言,Father中定义为虚函数,Mather中未定义为虚函数,Child继承了父母。运行结果是Father,Mather也就是说各自调用了各自的函数。
我是这样理解的
对于f->func而言,因为Child未定义,所以就到了父类,而m->func本身和虚函数就没关系
而main中被注释掉的两行是要编译出错的,因为不知道要调用哪一个
扩展一:
如果把Child中的注释打开,运行结果是Child,Mather,这和上面的分析是一致的
扩展二:
如果把Father中func的定义换成纯虚函数,那么Child编译报错,要求必须实现func,这点有些不够智能,毕竟对于java中类似情况就不用再实现了