为什么 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
主要.cpp
#include "genericdata.h"
int main(int argc, char *argv[])
{
Data1 data;
return 0;
}
通用数据.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
通用数据.cpp
#include "genericdata.h"
GenericData::GenericData(int size) :
m_size(size)
{
std::cout << "m_size: " << m_size << std::endl;
}
最佳答案
非静态成员Data1Size
的类内初始化器
const int Data1Size = 3;
只是意味着编译器将在GenericData
的构造函数中为Data1Size
生成一个隐式构造函数初始化列表条目。所以,实际上 GenericData
的构造函数如下所示
GenericData::GenericData(int size) :
m_size(size), Data1Size(3)
{
std::cout << "m_size: " << m_size << std::endl;
}
GenericData
的构造函数将 Data1Size
设置为其初始值 3
。
但是,您在 派生 类中访问 Data1Size
之前 基类 GenericData
的构造函数有一个做任何事情的机会。此时 Data1Size
仍未初始化。
关于C++继承误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35761232/