1 c++
所以我在C++中遇到了ABC设计的问题.我将使用我实际拥有的简化示例.在我遇到问题之前,请忽略任何语法错误.
所以我有一个ABC:
class ABC
{
public:
virtual void DoSomething() = 0;
};
Run Code Online (Sandbox Code Playgroud)
然后我有一个派生类:
class Derived: public ABC
{
public:
void DoSomething() { // something }
};
Run Code Online (Sandbox Code Playgroud)
在我的主要逻辑功能中,我有以下几点:
ABC* obj = new Derived;
obj->DoSomething();
Run Code Online (Sandbox Code Playgroud)
现在,在这一点上,我的代码运行得很漂亮,如果我使用抽象基类作为派生对象的类型将类型(现在手动)从一个派生类更改为另一个派生类,我有多个类正常运行.
现在我的问题......
如果我想更改我的派生类以添加ABC不支持的功能,那么我的编译器无法识别它们.例如,如果我按原样离开ABC并将Derived更改为:
class Derived: public ABC
{
public:
void DoSomething() { // something }
void DoSomethingElse() { // something else, not defined in ABC}
};
Run Code Online (Sandbox Code Playgroud)
然后回到我的主要逻辑功能:
ABC* obj = new Derived;
obj->DoSomething();
// Compiler does not recognize this, due to not being in the "ABC" class
obj->DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)
我的编译器一直给我错误"DoSomethingElse()"不是ABC的成员.我正在尝试做什么?感觉就像我忽略了一些简单的东西,但我在这个软件的架构中遇到了这个障碍.任何帮助是极大的赞赏.
您正在试图调用该方法只在派生类中存在,所以你需要转换obj指针像这样来调用这个方法:
Derived* derivedObj = dynamic_cast<Derived*>(obj);
derivedObj->DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)
请注意,dynamic_cast将执行运行时检查以确保它obj是同一类层次结构的一部分(即它是"有效"强制转换),并且如果强制转换无效,则返回0.请注意,您需要启用RTTI才能使用dynamic_cast.
像这样的演员可以被认为是代码嗅觉,并且可能有更好的方式来实现你正在做的事情.
当您使用抽象基类时,即当方法在基类中是纯虚拟的,并且在任何派生类中实现时,多态性(您在此处尝试实现的)更有效.这与其他语言的接口类似.