这段代码到底发生了什么?

时间:2014-08-05 16:45:27

标签: c++ oop inheritance constructor

在下面的代码Num2(int x)构建Num1的实例并立即销毁它? Num1(x)初始化私有的int aint b,因此派生类无法访问它们。但是,为什么编译器不抱怨?

此外,Num1的尺寸为8,Num2为12,Num3为4。

#include <iostream>
    using namespace std;

    class Num1 {
        int a;
        int b;
    public:
        Num1(int x) : a(x), b(0) {}
        ~Num1() {}
    };

    class Num2 : public Num1 {
        int c;
    public:
        Num2(int x) : Num1(x) {}
        ~Num2() {}
    };

    class Num3 {
        int d;
    public:
        Num3() {}
        ~Num3() {}
    };

    int main() {
        cout << "sizeof(Num1) = " << sizeof(Num1) << endl;
        cout << "sizeof(Num3) = " << sizeof(Num3) << endl;
        cout << "sizeof(Num2) = " << sizeof(Num2) << endl;
        return 0;
    }

为什么Num2 12的大小无法访问ab?有什么意义呢?

2 个答案:

答案 0 :(得分:0)

Num1是Num2的父类。当整数x传递给Num2构造函数时,调用基础构造函数将该参数传递给它(初始化int a)。

另外

cout << "sizeof(Num2) = " << sizeof(Num3) << endl;

应该是

cout << "sizeof(Num2) = " << sizeof(Num2) << endl;

答案 1 :(得分:0)

私有变量可以帮助完成课堂幕后的工作,创作者不希望你干扰的工作。仅仅因为你看不到或访问私有变量,这并不意味着编译器只是扔掉它们。也许在这个例子中你会更有意义:

class Animal {
    int legs;
public:
    Animal(int legs) : legs(legs) {}
    ~Animal() {}
    std::string how_fast() {
        if(legs > 4) {
            return "Super fast!";
        } else if (legs > 2) {
            return "Pretty fast.";
        } else {
            return "Slow.";
        }
    }
};

class Lion: public Animal{
    int humans_eaten;
public:
    Lion(int eaten) : Animal(4), humans_eaten(eaten) {}
    ~Lion() {}
};

此处legsAnimal类中是私有的,因为这应该已经为孩子们所知。如果我在Lion进行计算需要我使用腿数,那么它总是4,但是Animal并非总是这样。

即使Lion永远不能访问Animal的legs,但动物需要知道how_fast中计算的数字。这有意义吗?