0

我正在尝试理解继承,我需要一些帮助来构建两个类。第一个称为 A,第二个称为 B。A 有一个私有整数值“m_a”。它有两个构造函数,默认的一个将 m_a 设置为 5。另一个将一个称为 m 的整数作为参数并将 m_a 的值设置为 m。至于成员函数,它将有两个。第一个将返回 m_a。第二个将打印“Hello from A!”。让我们继续讨论 B。B 将有一个私有字符串 m_s。将 m_s 设置为“asd”或空字符串以外的任何内容的默认构造函数,以及将字符串作为参数并将 m_s 设置为它的值的构造函数。就函数而言,首先 B 将有一个返回 m_s 的函数。它将具有一个与 print "同名的函数

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

3 回答 3

1

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

class B : A {

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

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; }
于 2012-12-16T13:28:22.850 回答
1
(is that polymorphism ?).

不是你做的方式。如果您有一个指向A*实际B对象的类型的指针,并且调用该指针正确调用 B 的成员函数,这将是多态性。这只有在 A 中的函数被声明为虚拟函数时pm才有可能,如下所示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是光谱的另一端时。基类的所有成员在派生类中保留其可访问性(公共保持公共等)

于 2012-12-16T13:25:19.007 回答
1

尝试更改class B : Aclass B : public A

于 2012-12-16T13:26:36.367 回答