C ++继承误解

时间:2016-03-03 01:04:10

标签: c++ oop inheritance

为什么不std:cout打印3

为了构建具有预定义m_size的派生对象,开发了以下代码。但似乎这个想法没有得到正确实施,因为std:cout打印除Data1Size以外的任何内容。有人可以纠正我吗?

untitled.pro    

TARGET = untitled
TEMPLATE = app

QMAKE_CXXFLAGS += -std=c++0x

SOURCES += main.cpp \
    genericdata.cpp

HEADERS  += \
    genericdata.h

的main.cpp

#include "genericdata.h"

int main(int argc, char *argv[])
{
    Data1 data;

    return 0;
}

genericdata.h

#ifndef GENERICDATA_H
#define GENERICDATA_H

#include <iostream>

class GenericData
{
    int m_size;

protected:
    const int Data1Size = 3;

public:
    explicit GenericData(int size);
};

class Data1 : public GenericData {
public:
    Data1() : GenericData(Data1Size) {}
};

#endif // GENERICDATA_H

genericdata.cpp

#include "genericdata.h"

GenericData::GenericData(int size) :
    m_size(size)
{
    std::cout << "m_size: " << m_size << std::endl;
}

2 个答案:

答案 0 :(得分:2)

非静态成员Data1Size

的类内初始值设定项
const int Data1Size = 3;

只是意味着编译器将在Data1Size的构造函数中为GenericData生成隐式构造函数初始值设定项列表条目。因此,实际上GenericData的构造函数将如下所示

GenericData::GenericData(int size) :
    m_size(size), Data1Size(3)
{
    std::cout << "m_size: " << m_size << std::endl;
}

GenericData的构造函数将Data1Size设置为其初始值3

但是,在基类Data1Size的构造函数有机会执行任何操作之前,您正在派生中访问GenericData。那时Data1Size仍然没有初始化。

答案 1 :(得分:1)

在使用Data1Size之前,请先使用它:

Data1() : GenericData(Data1Size) {}

这会在Data1Size构建之前访问GenericData。毕竟,你正准备调用构造函数的参数,所以它还没有被构造。但Data1SizeGenericData的成员 - 您必须已有该类的实例才能访问它。