gpt4 book ai didi

c++ 具有函数的类继承

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:11 26 4
gpt4 key购买 nike

我一直在为考试而学习 c++,我认为我已经理解了大部分 c++ 常见的错误观念,非常疲倦,但我遇到了一个让我发疯的过去考试的练习,它结合了虚拟方法和继承以一种我似乎不理解的方式是代码:

    #include <iostream>

class B;

class A {
public:
virtual A* set(A* a) = 0;
};

class B : public A {
public:
virtual A* set(B* b) {
std::cout << "set1 has been called" << std::endl;
b = this;
return b;
}

virtual B* set(A* a) {
std::cout << "set2 has been called" << std::endl;
a = this;
return this;
}
};

int main(int argc, char *argv[]) {
B *b = new B();
A *a = b->set(b);
a = b->set(a);
a = a->set(b);
a = a->set(a);
return 0;
}

输出是

set1 has been called
set2 has been called
set2 has been called
set2 has been called

从我收集到的第一个调用 (b->set(b) ) 调用类 B 的第一个方法并返回 b 本身然后这个 objectref 被转换为 A 意味着现在对象 b 现在是类型A? 所以我有 A *a = A *b;现在对我来说,我应该叫 set of A 是有道理的,因为我脑子里有这种情况objectoftypeA->set(objectoftypeA) 所以我不应该研究虚拟方法,因为这两个对象是基类?

无论如何,正如你所看到的,我有很多困惑,所以如果我犯了愚蠢的错误,请耐心等待,如果有人能解释这段代码是怎么回事,我会很高兴,我试图搜索网络,但我只找到了一个小而简单的例子不要惹麻烦。

最佳答案

该程序演示了如何查找成员函数。对象的静态类型决定了将被调用的函数重载:它执行名称查找。然后动态类型决定被调用的虚拟覆盖。

也许关键点在于,同名的不同重叠实际上是不同的功能。

由于 A 只有一个 set 成员,所以当您调用 a->set() 时,只会发生一件事,不管争论是什么。但是当您调用 b->set() 时,有几个潜在的函数,并且会选择最好的一个。

因为 B::set 永远不会被覆盖,所以它是否是 virtual 没有区别。 virtual 同一类的成员根本不互相交谈。

关于c++ 具有函数的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383877/

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