gpt4 book ai didi

c++ - C++继承与虚函数问题

转载 作者:行者123 更新时间:2023-12-02 10:19:00 26 4
gpt4 key购买 nike

我想显示结果为2。(现在结果为1。)

我应该怎么做? (我想调用B::test()。但是实际上代码无法访问main.c中的b.h,b.c)

我也想知道a.h中从“public:virtual int test(){return 1;}”到“protected:virtual int test(){return 1;}”的错误

继承关系是
超甲类乙类
super A级C级

但是我可以在main.c中访问一个类
我想得到结果2。(“a.test()”无法调用“b.test()”)

// a.h
#ifndef _A_
#define _A_

class A {
public:
A() {};
~A() {};
//protected:
virtual int test() {return 1;}
private:
friend class B;
};

#endif
// b.h
#ifndef _B_
#define _B_
#include "a.h"

class B : public A {
public:
B() {};
~B() {};
private:
int test() override;
friend class A;
};

#endif
// b.c
#include "b.h"

int B::test()
{
return 2;
}
// c.h
#ifndef _C_
#define _C_
#include "a.h"

class C : public A {
public:
C() {};
~C() {};
private:
int test() override;
friend class A;
};

#endif
// c.c
#include "c.h"

int C::test()
{
return 3;
}
// main.c
#include <iostream>
#include "a.h"

using namespace std;

int main(void)
{
A *a = new A();
cout << a->test() << "\n";
return 0;
}

最佳答案

考虑您的代码:

// main.c
#include <iostream>
#include "a.h"

using namespace std;

int main(void)
{
A *a = new A();
cout << a->test() << "\n";
return 0;
}

行为的关键决定因素是 =new A()

如果将其更改为 =new B(),则将得到所需的结果“2”。

但是,您已经添加了限制“代码无法访问b.h”。这意味着 =new B()将不会编译。该限制来自何处?您可以使用极其复杂的工厂模式来实现此目的,但是看来这不是您要尝试的方法。

在层次结构的每个级别上,对于同一方法(本例中为 private),访问说明符( protectpublictest())应该相同。这不是由编译器绝对强制执行的,但这是最佳的实践。制作 test()privateprotected几乎没有什么区别,但在两种情况下,表达式都如下:
a->test()  

将在main中失败,因为它在类之外,并且只能访问 public成员。

还值得指出的是,如图所示,在代码中完全不需要 friend声明。

关于c++ - C++继承与虚函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040004/

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