C++ 如何避免基类中的polymophic调用

C++ 如何避免基类中的polymophic调用,c++,polymorphism,C++,Polymorphism,我有一个类,其中一些方法调用其他方法,如以下示例所示: class Base { public: virtual void foo() { cout << "base::foo" << endl; bar(); } virtual void bar() { cout << "base::bar" << endl; } }; 在上面的示例中,当我调用派生::foo()时

我有一个类,其中一些方法调用其他方法,如以下示例所示:

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

在上面的示例中,当我调用派生::foo()时,它调用Base::foo(),后者反过来调用bar();由于多态性,当从Base::foo()调用bar()时,它将解析为派生的::bar()。我希望Base::foo()调用Base::bar(),并且只调用派生的方法来调用Base方法。是否可以在不修改基类的情况下实现这一点?

您可以通过限定函数名称来对虚拟函数使用静态分派:

virtual void foo() {
    cout << "base::foo" << endl;
    Base::bar();
}
virtualvoidfoo(){

不可能,不修改基类的某些方面是不可能的。您可以修改
base::foo()
使其显式调用
base::bar()
,也可以修改
Derived::bar()
使其显式调用
Derived::foo()
。需要避免虚拟函数调用确实表明了一个设计问题-如果你不想要虚拟函数调用,为什么函数是虚拟的?@Peter,实际上在现实世界中,基继承自抽象类,这就是为什么方法是虚拟的。这并没有改变我的观点。你是从抽象基继承的,所以至少,派生类可以(或者必须,如果它们是纯的)重写它们继承的函数。事实上,您希望更改某些内容以避免调用派生版本,这表明您存在设计问题。您实际上是在试图解决自己设计中的缺陷
int main() {
    //Base A;
    Derived A;
    A.foo();
    return 0;
}
virtual void foo() {
    cout << "base::foo" << endl;
    Base::bar();
}