重写超级成员

时间:2013-09-30 21:45:44

标签: c++ inheritance override

我正在尝试继承公共库中定义的类,同时覆盖它的一些函数和成员类型,我有几个问题:

  1. 在超类中没有任何函数声明为虚函数,所以是否可以覆盖这些函数?

  2. 我可以通过简单地声明一个名称相同但类型不同的变量来覆盖成员变量。这跟隐藏一样吗?

  3. 此外,如果可以2,那么我可以执行以下操作:

    public class A {
      public:
        class Member {
            Member (//some params) {};
        }
    }
    
    class B : public A {
      public:
        class Member : public A::Member {
            Member () :
               A::Member(//some params) 
            {
                // Some additions to B::Member
            }
        }
    }
    
  4. 注意:由于我无法更改超类模板是不可能的。

3 个答案:

答案 0 :(得分:1)

  1. 您覆盖虚拟功能。如果不是,你就是在躲藏。

  2. 隐藏名称。

  3. 不,你不能。

答案 1 :(得分:1)

  1. 不,你不能覆盖它们。它只是隐藏它们。
  2. 它没有超越,它正在隐藏。
  3. 你不能。

答案 2 :(得分:1)

  1. 如果你隐藏基类的功能 - 你不能覆盖它们,因为它们不是虚拟的 - 你必须记住某些场景,如通过指针调用或引用基类不会起作用预期并可能产生“有趣”的结果。如果析构函数是非虚拟的,并且您试图通过指向基类的指针销毁派生对象,那么您也会遇到问题。

  2. 您将隐藏基类的同名成员,但同样很可能它不会按预期执行。基类实现仍将引用基类的成员,而派生类的实现将引用派生类的成员。

  3. 没有

  4. 您可能希望查看包装“基础”类而不是尝试从中派生。