gpt4 book ai didi

C++抽象基类问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:07:53 26 4
gpt4 key购买 nike

所以我在使用 C++ 进行 ABC 设计时遇到了问题。我将使用我实际拥有的一个简化示例。请忽略任何语法错误,直到我找到我的问题所在。

所以我有一个 ABC:

class ABC  
{
public:
virtual void DoSomething() = 0;
};

然后我有一个派生类:

class Derived: public ABC  
{
public:
void DoSomething() { // something }
};

在我的主要逻辑函数中,我有一些类似的东西:

ABC* obj = new Derived;
obj->DoSomething();

现在,我的代码工作得很好,如果我使用抽象基类作为派生对象的类型,将类型从一个派生类更改为另一个派生类(暂时手动),我有多个类可以正常运行。

现在我的问题...

如果我想更改派生类以添加 ABC 不支持的功能,那么我的编译器将无法识别它们。例如,如果我按原样保留 ABC 并将 Derived 更改为:

class Derived: public ABC  
{
public:
void DoSomething() { // something }
void DoSomethingElse() { // something else, not defined in ABC}
};

然后回到我的主要逻辑函数:

ABC* obj = new Derived;  
obj->DoSomething();
// Compiler does not recognize this, due to not being in the "ABC" class
obj->DoSomethingElse();

我的编译器一直给我错误“DoSomethingElse()”不是 ABC 的成员。我正在尝试做的事情可能吗?感觉就像我忽略了一些简单的东西,但我在我的软件架构中遇到了这个障碍。非常感谢任何帮助。

最佳答案

您正在尝试调用派生类中存在的方法,因此您需要像这样转换obj 指针来调用此方法:

Derived* derivedObj = dynamic_cast<Derived*>(obj);
derivedObj->DoSomethingElse();

请注意 dynamic_cast 将执行运行时检查以确保 obj 是同一类层次结构的一部分(即它是“有效”转换),并且如果转换无效,将返回 0。请注意,您需要启用 RTTI使用 dynamic_cast

像这样的转换可以被认为是一种代码味道,可能有更好的方法来实现你正在做的事情。

当您使用抽象基类时,多态性(您在这里试图实现的)效果更好 - 即,当基类中的方法是纯虚拟,并且已实现 在任何派生类中。这类似于其他语言中的接口(interface)

关于C++抽象基类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932245/

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