学习传承

Learning inheritance

本文关键字:传承 学习      更新时间:2023-10-16

我正在努力理解继承,我需要一些帮助来构建两个类。第一个叫A,第二个叫B。A有一个私有整数值"m_A"。它有两个构造函数,默认的构造函数将m_a设置为5。另一个是将一个名为m的整数作为自变量,并将m_a的值设置为m。对于成员函数,它将有两个。第一个将返回m_a。第二个将打印"你好,来自A!"。让我们转到B。B将有一个私有字符串m_s。默认构造函数将m_s设置为"asd"或空字符串以外的任何值,构造函数将字符串作为参数并将m_s设为其值。就函数而言,首先B将有一个函数,它将返回m_s。它将有一个与a中的打印"Hello from a"函数同名的函数,该函数将覆盖它,并将打印"你好from B!"(这是多态性吗?)。

这些都是需要的课程。我有以下问题(我将在下面发布我创建的内容)首先,有没有任何方法可以从基类获取私有数据文件。例如,假设我想取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!"
}

有什么方法可以从基类获取私有数据文件吗

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

至于编译错误@ArunKumar准确地得到了它。当你说Class B : A你从A继承,但默认情况下所有成员都继承为私有成员,因此基类构造函数是私有的,所以你不能使用它。

然而,当你说Class B : public A时,它是光谱的另一端。基类的所有成员在派生类中保留其可访问性(public仍然是public等)

问题是您使用的是私有继承:

class B : A {

默认情况下,通过类的继承是私有的。在A之前添加public

class B : public A {

至于你的另一个问题。。。

I want to take the m_s variable, add it to another one and print out their sum.

当涉及到std::string时,这很容易。只需创建另一个成员函数:

void addTom_s(string s) { m_s += s; }

尝试将class B : A更改为class B : public A