gpt4 book ai didi

c++ - 从派生类访问虚拟基类函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:30 25 4
gpt4 key购买 nike

1.下面的main函数中,为什么d.foo(9.5)没有选择基类的Base::foo(double)方法?派生类不继承那个方法吗?

2.编译错误是什么原因造成的?

class Base {
public:
virtual void foo(int){
cout << "Base::foo(int)" << endl;
}
virtual void foo(double){
cout << "Base::foo(double)" << endl;
}
};

class Derived : public Base {
public:
virtual void foo(int){
cout << "Derived::foo(int)" << endl;
}
};

void main() {
Derived d;
Base b, *pb = &d;

d.foo(9); // selects Derived::foo(int)
d.foo(9.5); // selects Derived::foo(int)
pb->foo(9); // selects Derived::foo(int)
pb->foo(9.5); // selects Base::foo(double)

Derived * d;
d->foo(9); // compile error
}

最佳答案

编译错误是因为main()中有两个同名变量。

关于你的继承函数没有被你的Derived实例调用的问题(除了通过指向Base的指针)

该标准描述了使这种情况发生的“隐藏规则”。本质上,在派生类中声明的成员函数隐藏了从基类继承的具有相同名称但不同签名的继承函数。隐藏规则与继承函数是否为虚函数无关。

常见的解决方案是使用 using Base::foo 从基类引入所有继承的函数。例如,

class Base {
public:
virtual void foo(int){
cout << "Base::foo(int)" << endl;
}
virtual void foo(double){
cout << "Base::foo(double)" << endl;
}
};

class Derived : public Base {
public:
using Base::foo;
virtual void foo(int){
cout << "Derived::foo(int)" << endl;
}
};

另一个解决方案是记住显式覆盖函数的所有继承版本(实现派生类版本以简单地调用每个函数的基类版本)。这适用于不支持像上面那样的 using 指令的旧编译器。要注意的是,有必要对每个继承的重载显式执行此操作,而且很容易遗漏一个。

关于c++ - 从派生类访问虚拟基类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28561622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com