c++ - 成员变量继承

标签 c++

我有这段代码,注意两行被注释掉了

#include <iostream>

class foo {
public:
    foo();
    int i;
};

class bar: foo {
public:
    bar();
    //int i;
};

foo::foo()
{
    i = 2;
}

bar::bar()
{
    i = 4;
}

int main()
{
    bar *b = new(bar);
    //std::cout << "bi = " << b->i << std::endl; /*line 28*/
    foo *f = (foo*) b;
    std::cout << "fi = " << f->i << std::endl;
}

注释掉这两行后,代码编译,输出为

fi = 4

取消注释这两行,代码编译并输出

bi = 4

fi = 2

只有类 bar 中的 i 声明被注释掉编译失败

var.cc: In function ‘int main()’:

var.cc:6:7: error: ‘int foo::i’ is inaccessible

var.cc:28:30: error: within this context

前两种情况我理解,但我不理解这个编译错误。为什么是

变量“i”可从 bar 构造函数访问,但不能从 bar 指针访问?

最佳答案

在私有(private)继承中,基类的所有成员变为private派生类的成员。请注意,对于类,默认继承是 private当您未指定任何内容时。

i充当private bar的成员, 它可以在 bar::bar() 中访问但不能来自成员函数之外。

好读:

What are access specifiers? Should I inherit with private, protected or public?

关于c++ - 成员变量继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15497953/

相关文章:

C++优化简单循环

c++ - 为什么long long n = 2000*2000*2000*2000;溢出?

c++ - 错误 : ambiguous overload for ‘operator==’

c++ - 如何在所有可变参数模板参数上调用函数?

c++ - 展开新对象并将其添加到函数内的数组

c++ - 使用信号处理程序处理从 fifo 接收的数据

c++ - 链接时 D3DCompileFromFile 未解析的外部

c# - 使用命名管道将图像帧从 C++ 服务器发送到 C# 客户端

C++:从装箱元素的 vector 构造一个 Box 类型的 vector

c++ - MS Word InsertBreak 抛出异常