跳到主要内容

类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什么 ?

参考答案:

在C++中,表达式 ClassA *a = new ClassB(...); 是合法的,但有一些需要注意的地方。

首先,这个表达式创建了一个ClassB的实例,并将其地址赋给了一个ClassA类型的指针a。这是合法的,因为ClassBClassA的派生类。在C++中,派生类的对象可以隐式地转换为基类的指针或引用。

然而,需要注意的是,虽然a是一个ClassA类型的指针,但它实际上指向了一个ClassB的实例。这意味着你可以通过a来访问ClassA的公有(public)和保护(protected)成员,但不能直接访问ClassB特有的公有或保护成员,除非通过某种方式将a转换为ClassB类型的指针或引用。

此外,如果你试图通过a来调用ClassA的虚函数,并且这个虚函数在ClassB中有一个重写版本,那么将会调用ClassB中的重写版本,这是多态性的一个体现。

总的来说,ClassA *a = new ClassB(...); 是合法的,但你需要清楚地理解这个表达式的含义和限制。