C ++多态:从基类到派生类

时间:2012-08-14 14:44:52

标签: c++ polymorphism

class A{};

class B : A{};

void func(A* p)
{

      B* p2 = p; // Error

}

3 个答案:

答案 0 :(得分:4)

你的代码有几个奇怪的地方。

  1. 您使用私有继承。在私有继承中,当你不在类范围内时,你将无法转换为派生类。
  2. 即使你公开继承,你也需要在基类中至少使用一个虚函数(应该是析构函数)才能使用dynamic_cast
  3. 当你需要很多下线时,你有可能做错了什么。您可能应该重新考虑您提供的API的设计或使用。
  4. 通常情况如下:

    class A { 
    public:
      virtual ~A() {}
    };
    
    
    class Derived : public A {
    
    };
    
    void func(A* a) {
      if(Derived* d = dynamic_cast<Derived*>(a)) {
        // yeah, a is of type derived
      } else {
        // a is not of type Derived 
      }
    }
    

答案 1 :(得分:1)

is-a关系由public继承实现。当你继承它时private这是association关系,不是 is-a。因此B不是A。因此,您无法将A存储在B中,或A无法成为B

dynamic_cast无效,因为源类型不是多态的
static_cast也不会像那样工作'A'是'B'无法访问的基础

要建立is-a关系,您需要执行class B: public A{}

答案 2 :(得分:-1)

对于类,默认情况下使用私有继承。