gpt4 book ai didi

c++ - 学习传承

转载 作者:行者123 更新时间:2023-11-28 00:51:22 25 4
gpt4 key购买 nike

我想了解继承,需要一些帮助来构建两个类。第一个叫A,第二个叫B。A 有一个私有(private)整数值“m_a”。它有两个构造函数,默认的构造函数将 m_a 设置为 5。另一个构造函数将一个名为 m 的整数作为参数并将 m_a 的值设置为 m。至于成员函数,它将有两个。第一个将返回 m_a。第二个将打印“Hello from A!”。让我们转到 B。B 将有一个私有(private)字符串 m_s。一个默认构造函数,它将 m_s 设置为“asd”或空字符串以外的任何内容,以及一个将字符串作为参数并将 m_s 设置为其值的构造函数。就函数而言,首先 B 将有一个返回 m_s 的函数。它将有一个与 A 中的打印“Hello from A”函数同名的函数,它将覆盖它并打印出“Hello from B!”。相反(那是多态性吗?)。

那些是需要的类。我有以下问题(我将在下面发布我创建的内容)首先,有什么方法可以从基类获取私有(private)数据字段。例如,假设我想获取 m_s 变量,将其添加到另一个变量并打印出它们的总和。那可能吗 ? (以及如何)

此外,当我尝试使用不同于默认构造函数的构造函数创建类时,我也会出错。我显然做错了什么。问题是什么。

我想这些就是我现在所有的问题了,所以是时候发布源代码了。

#include <iostream>
#include <string>

using namespace std;

class A
{
private:
int m_a;
public:
A(){m_a = 5;}
A(int m)
{
m_a = m;
}
void pm()
{
cout << "Hello from A!" << endl;
}
int get_a()
{
return m_a;
}
};

class B : A
{
private :
string m_s;
public:
B(){m_s = "asd";}
B(string s)
{
m_s = s;
}
void pm()
{
cout << "Hello from B!" << endl;
}
string get_s()
{
return m_s;
}
};

int main()
{
A a(10);
a.pm();
cout << a.get_a() << endl;
B b("asd");
b.pm();
cout << b.get_s() << endl;
cout << b.get_a() << endl;
return 0;
}

最佳答案

(is that polymorphism ?).

不是你做的方式。如果你有一个类型为 A* 的指针,它指向实际上是一个 B 对象,并在该指针上调用 pm,这就是多态性正确调用了 B 的成员函数。这只有在 A 中的 pm 函数被声明为虚拟函数时才有可能,如下所示。

class A
{
...
virtual void pm(){
...
};
...

int main()
{
A* = new B();
A->pm(); //"Hello from B!"
}

is there any way I can get to the private data fileds from the base class

不确定您在这里的意思 - 您的示例谈到了派生类的私有(private)字段。通常良好的类设计意味着派生类不需要访问基类的(私有(private))字段,如果需要,您应该保护该字段。

至于编译错误 @ArunKumar 完全明白了。当你说 Class B : A 你继承自 A,但默认情况下所有成员都作为私有(private)继承,因此,基类构造函数是私有(private)的,因此你不能使用它。

但是,当您说 Class B : public A 时,它是频谱的另一端。基类的所有成员在派生类中保留其可访问性(公共(public)保持公共(public)等)

关于c++ - 学习传承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901655/

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