假设我有一个名为Base
的类和一个名为SuperBase
的类。鉴于add
接受Base*
,其中任何一个都有效:
SuperBase *super = new SuperBase;
bases.add(super);
或
SuperBase *super = new SuperBase;
bases.add((Base*)super);
答案 0 :(得分:9)
只要SuperBase
公开来自Base
,通过从派生到基础的隐式转换,第一个就可以正常工作:
struct base { virtual ~base() {} };
struct derived : base {};
base* b = new derived; // okay
第二个也有效,但忽略了Base
的保护:
struct derived : private base {}; // private base
base* b = new derived; // not okay, base is private
base* b = (base*)(new derived); // okay, but gross
如果它是private
,你可能不应该使用它。
答案 1 :(得分:1)
两者都有效 - 可以在需要父级的引用/指针的地方使用子级。这称为多态。
答案 2 :(得分:1)
两者都有效,但不需要super
到Base*
。