先上代码:
class Base {
public:
Base(){ };
virtual ~Base(){ };
virtual void FunA(){
qDebug()<<"Base FunA";
};
void FunB(){
qDebug()<<"Base FunB";
};
void FunBase(){
qDebug()<<"Base FunBase";
};
};
class Derived : public Base
{
public:
Derived(){ };
~Derived(){ };
void FunA(){
qDebug()<<"Derived FunA";
};
void FunB(){
qDebug()<<"Derived FunB";
};
void FunDerived(){
qDebug()<<"Derived FunDerived";
};
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Base *obj = new Derived;//obj指向Base的指针
obj->FunA();//指向子类重写虚函数 //输出 Derived FunA
obj->FunB();//指向父类FunB() //输出 Base FunB
qDebug()<<"--------------";
Derived* obj2 = new Derived;//obj2 指向Derived的指针
obj2->FunA();//指向子类重写虚函数 //输出 Derived FunA
obj2->FunB();//指向子类FunB() //输出 Derived FunB
return a.exec();
}
输出:
Derived FunA
Base FunB
--------------
Derived FunA
Derived FunB
是个人理解:
1. 定义基类obj 指针指向基类, 调用非虚函数FunB()会调用基类的FunB();
2. obj2 指向Derived的指针, 调用与父类同名函数时候,父类的同名函数会被隐藏(就近原则);
3.上面举例有多态 继承 虚函数 虚函数表 隐藏 覆盖(重写虚函数) 等知识, 包括重载这里我都不写了