注意:本文中代码均使用 Qt 开发编译环境
请查看下面的代码,并回答注释中的问题
#include <QCoreApplication>
#include <QDebug>
class B
{
public:
void f(int) const {
qDebug() << "B.int" << endl;
}
void f(double) const {
qDebug() << "B.double" << endl;
}
};
class D: public B
{
public:
void f(void*) const {
qDebug() << "D.void" << endl;
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
D d;
d.f(0); //1.调用那个函数?
d.f(1); //2.调用那个函数?
d.f(0.1); //3.调用那个函数?
return a.exec();
}
答案:3个调用全部调用子类的f(void*)。但由于后两个不能转换为void*,编译出错。void*是可以指向
任何类型的指针。C++中,只有int 0可以转换为指针型,其余均不可以,所以出错。
关于子类函数对父类函数的覆盖:
在C++类里面,存在两个概念,一个是重载,一个是覆盖。
重载只是在类的内部存在,不会传导到父类和子类中间。即便是一个函数声明为virtual,也是这样。
如果一个类,存在和父类相同的函数,那么,这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用是不能成功的。