虚函数表分析 ==是实现多态的原理==
C++虚函数表剖析 http://blog.csdn.net/lihao21/article/details/50688337
C++ Upcast(向上造型)http://blog.csdn.net/zhang431705/article/details/22106447
动态绑定虚函数,静态绑定非虚函数
每个类有一个虚拟表(指针数组,元素是函数指针),在编译阶段赋值
普通虚函数(经常用到)
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0;
}
虚析构
https://baike.baidu.com/item/%E8%99%9A%E6%9E%90%E6%9E%84%E5%87%BD%E6%95%B0/240645?fr=aladdin
当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。
class ClxBase
{
public:
ClxBase() {};
virtual ~ClxBase() {};
virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};
class ClxDerived : public ClxBase
{
public:
ClxDerived() {};
~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };
void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};
int main(){
ClxBase *pTest = new ClxDerived;
pTest->DoSomething();
delete pTest; //如果没有虚析构只会 ,调用基类ClxBase析构
}
纯虚函数
类似其他语言抽象类或接口
1. 类不实例,继承后要么是抽象类,要么实现
2. 定义 virtual int A()=0;
问题
1.==为什么构造函数不能是虚构函数.==
构造函数是在创建对象之前初始化,虚函数是动态绑定运行时指定,每个对象拥有一个虚拟指针,构造函数是对象创建之前调用,虚函数是对象实例后才能调用,前后矛盾.