gpt4 book ai didi

c++ - 虚继承/多态

转载 作者:行者123 更新时间:2023-11-28 00:06:20 24 4
gpt4 key购买 nike

所以我正在研究一些奇怪的多态性案例歧义。有一种情况我无法理解。我不明白为什么下面代码的最后一行会这样。

#include <stdio.h>
#include <iostream>

class Article
{
public :
virtual bool compare(Article *a) { std::cout << "ACA" << std::endl;}; // ACA
};

class Clothe : public Article
{
public :
bool compare (Clothe *c) { std::cout << "CCC" << std::endl;}; // CCC
bool compare (Article *a) { std::cout << "CCA" << std::endl;}; // CCA
};



int main()
{
Article *pta1 = new Article;
Article *pta2 = new Clothe;
Clothe *ptv1 = new Clothe;

pta1->compare(pta2); // print ACA
pta2->compare(pta1); // print CCA
pta2->compare(pta2); // print CCA because compiler needs to explore pta2 to determine which compare to use.
// pta2 is instanced as a Clothe, so one of Clothe's compare will be called.
// And judging by its declaration pta2 is an Article (even thought it's instanced as a Clothe),
// so it will Call Clothe::Compare(Article*). I'm OK with this

pta2->compare(ptv1); // print CCA ??? WHY , pta2 is explored, thus it's type is determined to be of type Clothe.
// And ptv1 is declared as a Clothe, so it should call Clothe::compare(Clothe* c)
// should print CCC, shouldn't it ?
}

我迷路了。我不明白 g++ 如何以这种方式解决歧义。任何帮助/解释都会很好。感谢阅读,更感谢回答的人。

PS : 我知道比较应该返回 bool 值,但它在这里并不重要。

编辑:在我即时翻译变量名时出现错字,名称最初是法语的,对此深表歉意。现在已经修好了

最佳答案

这一行

pta2->compare(ptv1);

打印CCA,因为基类中只有虚函数bool compare(Article *a)

你对 pta2 的假设是错误的。

pta2 is explored, thus it's type is determined to be of type Clothe.

事实并非如此。 pta2 的类型是 Article *,没有别的。它只指向一个 Clothe 对象,因此可以通过它调用 Clothe 的函数,如果(且仅当)它们存在并且是虚拟的,并且基类和在派生类中重写(使用相同的签名!)。

简单来说:

如果调用是通过基类指针执行的,编译器只能在派生类中“找到”在基类中存在和虚拟的重载。

这里发生了什么:

  1. pta2 是指向 Article 的指针。因此,在调用compare 时,考虑了Articlecompare 函数的不同可能性。

  2. 唯一的匹配项是 bool Article::compare (Article *a)

  3. 现在编译器发现 Article 中的 compare 是虚拟的,并使用某种内部机制通过对象的“vtable”进行虚拟调用。

  4. Clothe 覆盖 bool compare (Article *a) 时,覆盖的函数被调用。

基类对bool compare (Clothe *c)一无所知,因为它对Clothe一无所知,因此输出不是CCV.

关于c++ - 虚继承/多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35536892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com