虚函数的函数定义问题
class Myclass { public: virtual int FuncX(); virtual int FuncY(); }; int main() { Myclass obj; // 编译报错 cout << "hello" << endl; return 0; }
class Myclass { public: int FuncX(); int FuncY(); }; int main() { Myclass obj; cout << "hello " << endl; return 0; }
结论:
只要一个类拥有虚函数,当定义该类对象时,就必须实现其全部的虚函数定义。
若一个类只有非virtual的成员函数(没有虚函数),当定义该类对象时,可以不必实现该类的成员函数的定义,只在类中进行成员函数的声明也是允许的。
类似的一个实验:
class Fatherclass { public: virtual int FuncX(); virtual int FuncY(); }; class Son : public Fatherclass { public: };
int main() { cout << "hello Fatherclass " << endl; Son sonobj; return 0; }
结论: 如果一个含有虚函数的类作为父类,当定义其派生类的对象的时候,需要实现该父类中全部的虚函数的定义。
由于继承关系导致的虚函数的例子:
class Fatherclass { public: virtual int FuncX(); virtual int FuncY(); }; int Fatherclass::FuncX() { return 0; } int Fatherclass::FuncY() { return 0; } class son : public Fatherclass { public: int FuncX(); // 这里需要实现son类内部全部的虚函数定义。( 此处只有一个FuncX ) }; #if 1 int son::FuncX() { return 0; } #endif int main() { Fatherclass obj; son objson; // 编译报错 cout << "hello " << endl; return 0; }
结论:
由于继承关系,导致子类son的FuncX也是虚函数,所以就必须实现子类的FuncX的函数定义,而不能仅仅是在类中进行函数声明。