[英]Learning inheritance
我正在尝试了解继承,并且需要一些帮助来建立两个类。 第一个称为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中的打印“来自A的Hello”功能同名的功能,它将覆盖该功能,并打印出“来自B的Hello!”。 相反(是多态性吗?)。
这些是所需的类。 我有以下问题(我将在下面发布我创建的内容)首先,有什么方法可以从基类访问私有数据文件。 例如,假设我要使用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
它是频谱的另一端。 基类的所有成员都保留其在派生类中的可访问性(公众保持公开状态,等等)
尝试将class B : A
更改为class B : A
class B : public A
问题是您正在使用私有继承:
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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.