C++重载基类内部调用

Posted

技术标签:

【中文标题】C++重载基类内部调用【英文标题】:C++ overloading a base class internal call 【发布时间】:2014-09-25 21:31:27 【问题描述】:

我想覆盖基类中的内部调用并保持相同的接口和通用算法。更改取决于对象的状态,因此不能只在构造函数中设置一次。有没有办法让它工作?或者也许是一种设计模式?

#include <iostream>
using namespace std;

class X

private:
    virtual void internalCall()
    
        cout << "Class X" << endl;
    
public:
    X()
    
        internalCall();
    
    void externalCall()
    
        internalCall();
    
;

class Y : public X

protected:
    virtual void internalCall2()
    
        cout << "Class Y2" << endl;
    
    virtual void internalCall()
    
        cout << "Class Y" << endl;
        internalCall2();
    
    public:
    Y() : X() 

;

int main()

    Y y;

    y.externalCall();

    return 0;

期望的输出:

Y 类

Y2 班

Y 类

Y2 班

实际输出:

X 级

Y 类

Y2 班

在我的机器上:

X 级

X 级

【问题讨论】:

发布一些实际编译的代码,您将看到预期的输出。请参阅此示例:ideone.com/GN4jeh 请显示您针对此问题的实际代码,您发布的内容正常:ideone.com/0K9LX7 相关阅读:***.com/questions/2170688/private-virtual-method-in-c 所以显然我的代码更复杂,但是当内部调用在构造函数中时,我已经复制了一半。最后一次通话我仍然有不同的行为,不知道发生了什么。 ideone.com/EzLRyG @Envy - 你期望它做什么? X() internalCall(); 【参考方案1】:

问题是您正在从X 的构造函数调用internalCall()。尽管它是一个虚函数,但在调用 X 的构造函数时,Y 尚未创建 - 所以你会得到 XinternalCall()

【讨论】:

是的,我知道那个,但我仍然不明白为什么在我的机器上我得到 Class X Class X 您必须更具体地了解您的环境。我无法复制您的输出:ideone.com/h0qjTM

以上是关于C++重载基类内部调用的主要内容,如果未能解决你的问题,请参考以下文章

从派生类调用重载函数

在C++中,啥是运算符重载?啥是虚函数?

C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法

C++操作符=重载继承,基类中定义了,派生类中是不是需要重新定义? [复制]

关于C++子类构造函数的重载问题

使用 C++ 定义接口(在不丢失基类的所有重载运算符的情况下派生)