在main()
下面的函数中,d
是一个基类指针(类型A
),它指向派生类(类型B
)。但是,当f(int)
在该指针上调用成员函数时,即d->f(1)
编译器将在基类A(标记为#2
)中调用非虚函数,即
void f(int n) const { std::cout << n; }
为什么?我期待着,因为在基类中还有一个虚函数A
virtual void f(int n) { std::cout << n; }
f(int)
派生类中的两个函数之一B
将被调用。我要去哪里错了?
class A
{
public:
A() {}
public:
virtual void f(int n) { std::cout << n; } // #1
virtual ~A() { }
void f(int n) const { std::cout << n; } // #2 this function is called when d->f(1) is executed in main()
};
class B
: public A
{
public:
void f(int n) { std::cout << n; } // #3
void f(int n) const { std::cout << n; } // #4
};
int main()
{
B b;
const A* d = &b;
d->f(1); // this calls function #2 above - why?
std::cout << std::endl;
return 0;
}
d
是指向const的指针A
。这意味着对成员函数的任何调用都会调用const限定的重载(如果存在)。在您的情况下,f
基类(#2
)中的const限定版本不是virtual
,因此d
指向B
对象的事实无关紧要。基类const限定的重载是被选择调用的重载。
如果f
在基类中virtual
进行const限定的重载,则将在派生类(#4
)中选择const限定的重载。
同样,如果d
是指向非常量的指针A
,则将调用f
派生类(#3
)中的非常量限定重载,因为基类(#1
)中的重载为virtual
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句