我正在尝试正确理解C ++中的继承。
首先,有一个类可以返回自身的实例吗?
class Class1 {
public:
Class1 foo();
}
基本上,我有一个派生方程的类,所以它取一个方程并返回一个方程式。
如果我想要Class1的一些子类也返回自己的实例:
class Child : public Class1 {
public:
Child bar();
}
我想使用Class1的一些函数但是不想返回Class1,我想返回Child对象,这是否可以继承?
谢谢,希望这个问题不是太愚蠢。
答案 0 :(得分:1)
是,
在我看来,你被描述为一个明确定义的问题,在Desing Pattern的说法中称为Factory
。
请考虑以下事项:
class Class1 {
public:
static Class1 * getInstance( Equation * eq );
virtual void foo() = 0;
}
class Child : public Class1 {
public:
virtual void foo();
}
class OtherChild : public Class1 {
public:
virtual void foo();
}
对于两个孩子,你将以不同的方式实现foo()方法。
所以,例如,你可以:
int main(){
Equation myEquation("x=y/4");
Class1 * myInstance = Class1::getInstance ( &myEquation );
myInstance->foo(); //would call the virtual method of the child class. You don't care what subclass, this was figured out by the "getInstance" method.
}
答案 1 :(得分:1)
如上所述,没有问题,但您打算如何使用它。返回
按价值涉及复制,复制和多态通常不会
好在一起。通常(但也有例外),它更可取
返回指向新分配的实例的指针。 (你必须解决
如果你这样做,内存管理问题。如果是逻辑意义的话
类是循环是不可能的,那么你可以使用
std::shared_ptr
;否则,你将不得不做别的事情。)
答案 2 :(得分:0)
首先,有一个课可以 返回自身的实例?
是的,没关系,在你的情况下,它听起来像一个很好的设计。您可以使用您提议的设计,或者您可以使用不同的设计,您的类将返回不同的对象,例如class DerivedEquation
,或者您还可以拥有class Deriver
Equation
并返回Equation
。所有这些设计都很好。
如果我想要一些Class1的子类 也返回实例 他们自己也想用一些 Class1的功能,而不是 返回Class1,我想 返回Child对象,这会是什么 继承可能吗?
那也没关系。您可以像提议的那样拥有Class1::foo()
和Child::bar()
。此外,如果您不想拥有2个不同的函数名称,则可以将foo
的定义更改为Class1 * foo()
或Class1 & foo()
,然后您就可以在Child
中重载它{1}}。