c++ - 我如何在其他类(或任何类)中使用抽象类?

标签 c++ oop abstract-class

我知道 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 而不是直接使用 BlueRed 作为参数。

什么是解决方案?我必须使用重载或其他东西吗?对于方法 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/

相关文章:

c++ - 如何将代码拆分成多个文件

c++ - OOP 设计播放器和 AI 控制单元。动态 Actor ?

c++ - 为什么重载 operator new 会改变 new[] 的行为?

c++ - 命名管道中没有字节

iphone - 编写可重用接口(interface)对象的正确技术?

c# - 将 XML 反序列化为从基类 C# 派生的对象

javascript - 基于另一个对象递归更新特定键的嵌套对象值

php - 面向对象的反面?

constructor - TypeScript 中的抽象构造函数类型

java - java中如何在不扩展抽象类的情况下访问抽象类方法