从这段代码开始:
class Base{
public:
virtual void foo(){....}
};
class Derived{
public:
void foo(){....}
};
如果d
是Derived
对象,我是否可以某种方式调用此对象的Base类中定义的foo方法?
编辑:我的意思是从外面看,d.foo()
绑定到Base :: foo()
答案 0 :(得分:6)
在通话中明确指定。
#include <iostream>
class Base{
public:
virtual void foo(){
std::cout << "Base" << std::endl;
}
};
class Derived : public Base{
public:
void foo(){
std::cout << "Derived" << std::endl;
}
};
int main()
{
Derived d;
d.Base::foo();
return 0;
}
答案 1 :(得分:6)
只需限定通话费用(假设Derived
实际上继承自Base
,而代码中没有Derived d;
d.Base::foo();
:
Derived::foo
现在,虽然这是可行的,但也很值得怀疑。如果该方法是虚拟的,则意图覆盖并且用户不应该调用特定的覆盖,而是 final-overrider ,否则它们可能会一直破坏类不变量。
考虑到Base::foo
的实现需要一些额外的工作来保持一些不变量,如果用户调用{{1}}将无法完成额外的工作而且不变量被破坏,使对象无效状态。
答案 2 :(得分:3)
要从外部代码调用它,您仍然可以在调用中明确限定名称:
#include <iostream>
#include <vector>
struct base {
virtual void do_something() { std::cout << "Base::do_something();\n"; }
};
struct derived : public base {
virtual void do_something() { std::cout << "derived::do_something();\n"; }
};
int main() {
derived d;
d.base::do_something();
return 0;
}
如果您使用指向该对象的指针,则会将其更改为d->base::do_something();
。