1.派生类中的字段名或者方法名会隐藏基类中的字段名或者方法名。不过这种隐藏不是多态,要想用父类指针调用子类方法,要用virtual,而不是这种简单的隐藏。
2.名字查找先于类型检查。
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Base
{
public:
virtual void Print()
{
cout<<"Base Function"<<endl;
}
};
class Child : public Base
{
public:
virtual void Print(int a)
{
cout<<"Child Function"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Child c;
//c.Print();这条语句是错误的,原因在于编译器先进行名字查找,找到了子类的方法,然后便停止了
//但是参数匹配是之后才进行,匹配参数时才发现子类的是需要一个参数的,所以会有错误
c.Print(1);
return 0;
}
可见,还是尽量要小心这种情况,子类和父类方法名相同,但是参数不同。
想要再调用父类的参数,则要通过父类的域名,c.Base::Print();
3.虚析构函数
虚析构函数的作用在于,如果子类继承了父类,通过使用父类指针进行delete操作的时候,虚析构函数能够定义到相应的子类,执行子类特有的析构函数操作,否则只执行父类的析构函数,将可能造成子类特有的资源未释放等情况。虚析构函数会自动调用父类的析构函数。