C++继承误解

标签 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

主要.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/

相关文章:

java - 如何解决 `Raw use of parameterized class ' Comparable'` 警告?

Java继承编译

c++ - 修复 linux 中缺少的 boost 共享库

c++ - 如何从 Python 使用 OpenCV 的 C++ 函数?

C++ lambda - 捕获成员变量

c# - 新程序员的 OOP 实现问题

c++ - 如何在C++中以几乎相同的方式编写具有相同名称的相同函数来处理不同的类参数?

Java acm、GRect方法、继承add方法不显示

c++ - 从继承变量构造派生类

c++ - 移动构造函数的意外调用