【问题标题】:Virtual, how to use it?虚拟,怎么用?
【发布时间】:2013-01-03 00:31:40
【问题描述】:
class a
{
    public:
        a(int);    
        virtual ~a();
        virtual void print();
        int getNumber()
    private:
        int number;
};

class b : public a
{
    public:
        b(int);
        virtual ~b();
};

class c : public b
{
    public:
        c(int);
        virtual ~c();
        virtual void print();
};

这些是代表 cpp 文件的标头。我在每个适当的 cpp 文件中实现了所有方法。 我使用了这段代码,它工作得很好,虽然我想知道 b 类是否也应该实现 print(甚至像这样:print(){}),因为在我看来它的编程更好。 那么合适的方法是什么? 是否实施(即使没有必要)?

【问题讨论】:

    标签: c++ oop inheritance virtual


    【解决方案1】:

    面向对象编程中继承的全部意义在于,您可以依赖于您不想重写的方法的超类实现。

    【讨论】:

      【解决方案2】:

      您应该只编写将被子类重载的函数。如果子类没有专门化给定的行为,那么在子类中编写父函数的副本将是不好的做法。这不仅会造成浪费并可能造成混淆,而且还可能在以后的某个时候导致错误。

      考虑一下:我称之为 Monkey 的父类和我称之为 Tarzan 的子类。在 Monkey 类中,我将为 Swing() 定义一个函数。

      现在,由于 Tarzan 是 Monkey 的衍生产品,并且学会了像 Monkey 一样在树上摆动,因此无需编写 Tarzan 自己版本的 Swing 函数。但是,假设我写它只是为了“完整”。现在,如果我需要更改猴子摆动的方式,我有 2 个例程要更新:一个用于 Monkey 类,另一个用于 Tarzan。更糟糕的是,如果我确实改变了猴子摆动的方式,而忘记在泰山中做出同样的改变,泰山将不再像猴子一样摆动,这将是出乎意料的,而且可能是错误的。

      结论:只在子类函数中编写代码,其中子类需要对已经为父类定义的内容进行专门化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 1970-01-01
        • 2012-05-29
        • 2013-03-15
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        相关资源
        最近更新 更多