如何将子类指针指向基类指针? [复制]

Posted

技术标签:

【中文标题】如何将子类指针指向基类指针? [复制]【英文标题】:How to point the child class pointer to the base class pointer? [duplicate] 【发布时间】:2019-09-13 18:41:28 【问题描述】:
class A 
public:
    void show() 
        cout << "Class A Show"<<'\n';
    
;

class C : public A 
public:
    void show() 
        cout << "Class C Show" << '\n';
    
;

int main()  //first int main()

    C* a = new C;  //line 1
    a->show();     //line 2
    a = new A(); //line 3
    a->show();   //line 4


int main()  //2nd int main()

    A* a = new C;  //line 1
    a->show();     //line 2
    a = new A(); //line 3
    a->show();   //line 4

问题:

在两个int main()中分别输出朗姆时的每一行

错误 “A*”类型的值不能分配给“C*”类型的值

我遇到了一个面试问题,小组询问了上述 2 int mains() 的输出,并询问它是否会产生错误,而不是我们如何忽略该错误。我在编译器上尝试了这段代码,错误出现在 First int main() 的第 3 行,而 2nd int main() 运行时没有出现错误

【问题讨论】:

你有什么问题? a 的第一个主要类型是C*,因为你不能在那里存储A*,因为C 派生自A,反之亦然 O 我怎样才能消除这个错误 如果问题是如何消除错误,答案是修复代码 我们知道每条鲱鱼都是一条鱼,但并非每条鱼都是一条鲱鱼。你有两个班,鱼班和鲱鱼班。 (1) 它们之间的自然关系是什么? (a) Fish 继承 Herring (b) Herring 继承 Fish (c) a 和 b (d) 既不是 a 也不是 b?为什么? (2)给定(1)的答案和这两个陈述Fish* fish = new Herring; Herring* herring = new Fish;哪个是正确的? (a) 第一个 (b) 第二个 (c) 两者 (d) 都不是?为什么? 【参考方案1】:

C++ 是一种严格类型的语言,因此您不能将一种类型的值分配给另一种类型的值。指向不同类型的指针是不同的类型。存在可以隐式转换的兼容类型的概念,但指向不同类型的指针不是其中之一。

现在允许将派生类的指针分配给基类的指针。从抽象的角度来看,如果类型 A 的类子对象是类类型 A 的对象。这种分配是类型擦除范式的一部分。但是相反是不可能的,因为A型不是C型。

【讨论】:

以上是关于如何将子类指针指向基类指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++获取基类指针所指子类对象的类名

将基类指针强制转换为子类指针后的疑惑

识别基类指针指向的子类对象

基类的函数指针指向子类的成员函数?

如何从指向多态基类的指针复制/创建派生类实例?

删除指向子类的指针会调用基类析构函数吗?