从这段代码开始:
class Base{
public:
virtual void foo(){....}
};
class Derived{
public:
void foo(){....}
};
如果d
是一个Derived
对象,我可以以某种方式调用基类中为该对象定义的 foo 方法吗?
编辑:我的意思是从外部,这样d.foo()
绑定到 Base::foo()
从这段代码开始:
class Base{
public:
virtual void foo(){....}
};
class Derived{
public:
void foo(){....}
};
如果d
是一个Derived
对象,我可以以某种方式调用基类中为该对象定义的 foo 方法吗?
编辑:我的意思是从外部,这样d.foo()
绑定到 Base::foo()
在调用中明确指定它。
#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;
}
只需限定调用(假设Derived
实际上继承自Base
,在您的代码中它没有):
Derived d;
d.Base::foo();
现在,虽然这是可行的,但也很值得怀疑。如果该方法是虚拟的,则意味着要被覆盖,并且用户不应调用特定的覆盖,而是调用final-overrider,否则他们冒着破坏类不变量的风险。
考虑到实现Derived::foo
需要做一些额外的工作来保持一些不变量,如果用户调用Base::foo
这些额外的工作将不会完成并且不变量被破坏,从而使对象处于无效状态。
要从外部代码调用它,您仍然可以在调用中明确限定名称:
#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();
.