类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什么 ?
参考答案:
在C++中,表达式 ClassA *a = new ClassB(...);
是合法的,但有一些需要注意的地方。
首先,这个表达式创建了一个ClassB
的实例,并将其地址赋给了一个ClassA
类型的指针a
。这是合法的,因为ClassB
是ClassA
的派生类。在C++中,派生类的对象可以隐式地转换为基类的指针或引用。
然而,需要注意的是,虽然a
是一个ClassA
类型的指针,但它实际上指向了一个ClassB
的实例。这意味着你可以通过a
来访问ClassA
的公有(public)和保护(protected)成员,但不能直接访问ClassB
特有的公有或保护成员,除非通过某种方式将a
转换为ClassB
类型的指针或引用。
此外,如果你试图通过a
来调用ClassA
的虚函数,并且这个虚函数在ClassB
中有一个重写版本,那么将会调用ClassB
中的重写版本,这是多态性的一个体现。
总的来说,ClassA *a = new ClassB(...);
是合法的,但你需要清楚地理解这个表达式的含义和限制。