虚函数未在类中调用

马可

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

派生类的虚函数调用基类的虚函数

来自分类Dev

基类中的虚函数

来自分类Dev

基类中的虚函数

来自分类Dev

从标记为final的类的构造函数中调用虚函数是一种不好的做法

来自分类Dev

在基类的析构函数中调用的虚函数的多态能力

来自分类Dev

在C ++中从派生类的析构函数调用虚函数

来自分类Dev

调用子重写时始终调用超类虚函数

来自分类Dev

从未定义基类的纯虚函数中调用它?

来自分类Dev

从基类函数内部进行虚函数调用

来自分类Dev

C ++调用相同虚函数的超类函数

来自分类Dev

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

来自分类Dev

在派生的模板类中从基类重新实现虚函数

来自分类Dev

C ++在构造函数中调用最终虚函数

来自分类Dev

未在 C 中调用的函数

来自分类Dev

函数未在 javascript 中调用

来自分类Dev

基类中的虚函数定义给出错误

来自分类Dev

C ++:正确覆盖模板类中的虚函数

来自分类Dev

尝试根据模板类型重载模板类中的虚函数

来自分类Dev

为什么派生类中的虚函数也虚拟?

来自分类Dev

测试子类是否覆盖基类中的虚函数

来自分类Dev

C ++:正确覆盖模板类中的虚函数

来自分类Dev

从operator <<调用纯虚函数

来自分类Dev

未调用重写的虚函数

来自分类Dev

从operator <<调用纯虚函数

来自分类Dev

Javascript中的虚函数

来自分类Dev

类模板和虚函数

来自分类Dev

类模板和虚函数

来自分类Dev

如何将C ++类转换为托管类并在其中调用纯虚函数?

来自分类Dev

C ++继承:使用派生类的实例调用基类的虚函数