我知道 Virtual Class 不能被实例化,现在我有一个关于它的问题,假设我们有一个像下面这样的纯抽象类:
class Color{
public:
Color();
virtual string getName()=0;
~Color();
};
和继承自它的 2 个类:
class Blue:public Color
{
public:
Blue();
~Blue();
string getName();
};
class Red:public Color{
public:
Red();
~Red();
string getName();
};
第三个类想使用Color
类作为它的构造参数和数据成员:
class Foo{
public:
Foo();
Foo(Color&);
~Foo();
void draw(Color&);
private:
Color* co;
};
及其实现:
Foo::Foo():co(new Color()){
}
Foo::Foo(Color &c):co(new Color(c)){
}
现在,我知道这部分 new Color()
和 new Color(c)
在这种情况下是错误的,但我只想使用类型 Color
传递给 Foo
而不是直接使用 Blue
或 Red
作为参数。
什么是解决方案?我必须使用重载或其他东西吗?对于方法 draw
我有什么问题吗?
我阅读了设计模式,它对我这个案例有帮助吗?
感谢您的回复。
最佳答案
对于采用 Color& 的构造函数,如果可以确定它会继续存在,则可以存储指向传入颜色的引用或指针,或者如果需要,智能指针可能适合您使用存储一个指向先前存在的颜色的指针,并确保它不会被过早删除。或者,如果您希望您的类(class)拥有自己的颜色拷贝,您可以使用克隆模式。 颜色的复制构造函数必须返回一种颜色(不是从它派生的类),这是不可能的,因为颜色是抽象的。克隆将是一个返回颜色指针的颜色虚函数。在派生类中,它被实现为返回派生类型的新实例。
class Color
{
public:
virtual Color* Clone() const = 0;
};
class Red : public Color
{
public:
virtual Red* Clone() const
{
return new Red(*this); // updated to use copy constructor
}
};
Foo::Foo(const Color& c) : co(c.Clone())
{}
对于默认的 foo 构造函数,您需要选择 foo 的 color* 成员是否可以为 null,如果可以,则按照建议传入 nullptr。 如果没有,您可以选择默认颜色来初始化颜色*。注意 Foo 仍然持有颜色* 而不是红色*。您可以使用 typedef 或 using 语句指定默认颜色类,以确保您只定义一次默认值:-
using DefaultColour = Red;
Foo::Foo() : co(new DefaultColour()) {}
或者只是不给 Foo 一个默认构造——坚持提供一个 Color
关于c++ - 我如何在其他类(或任何类)中使用抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38770220/