gpt4 book ai didi

c++ - 多重继承和单例设计模式

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:07 26 4
gpt4 key购买 nike

我设置了以下类层次结构并想要 print()非单例基础对象的功能OtherBase被调用又调用printSymbol()来自其中一个子类,在本例中为 SingletonChild .我知道这是一个复杂且看起来有些不必要的层次结构和做事方式,但这是一项任务,我必须以这种方式完成。

我的问题示例如下:

#include <iostream>
using namespace std;

class Object
{
virtual void print() = 0;
};

class SingletonBase : public Object
{
private:
static SingletonBase* theOnlyTrueInstance;
protected:
SingletonBase()
{
if(!theOnlyTrueInstance)
theOnlyTrueInstance = this;
}
virtual ~SingletonBase(){}
public:
static SingletonBase* instance()
{
if (!theOnlyTrueInstance) initInstance();
return theOnlyTrueInstance;
}
void print()
{ cout<<"Singleton"<<endl; }
static void initInstance()
{ new SingletonBase; }
};

SingletonBase* SingletonBase::theOnlyTrueInstance = 0;

class OtherBase : public Object
{
public:
virtual string printSymbol() = 0;
void print()
{ cout<<printSymbol(); }
};

class SingletonChild : public SingletonBase , public OtherBase
{
public:
string printSymbol()
{
return "Test";
}
static void initInstance()
{ new SingletonChild; }
};

int main() {
SingletonChild::initInstance();
OtherBase* test = (OtherBase*) SingletonChild::instance();
test->print();
return 0;
}

如何获取实例 test调用print一个基类的功能 OtherBase而不是 Singleton 基类 SingletonBase

我试过了test->OtherBase::print() , 但这没有用。

最佳答案

@MuhammadAhmad 的回答基本上是正确的。我想补充一点,这里的主要问题是 C 风格的转换允许你做一些你真的不想做的事情。因为您不能将 SingletonBase 静态转换为 OtherBase,所以 C 风格的转换正在执行 reinterpret_cast,并调用 结果指针上的 print() 是未定义的行为。如果您使用了 static_cast,则会出现错误:

OtherBase* test = static_cast<OtherBase*>(SingletonChild::instance());

error: invalid static_cast from type ‘SingletonBase*’ to type ‘OtherBase*’

这可能让您意识到您需要做一些不同的事情。例如,您可以使用 dynamic_cast 像这样向侧面转换。

关于c++ - 多重继承和单例设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39832942/

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