0
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(){}),因为在我看来它的编程更好。那么合适的方法是什么?实施(即使没有必要)还是不实施?

4

2 回答 2

1

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

于 2013-01-03T00:34:02.127 回答
0

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

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

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

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

于 2013-01-03T00:53:27.310 回答