2

假设我有以下两个类定义(只有访问说明符bar()不同,其他一切都相同):

class MyClass {
public:
    void foo();
    void bar();   // bar() is public

private:
    int member;
};

class MyClass {
public:
    void foo();

private:
    void bar();   // bar() is private
    int member;
};

编译器是否认为这些类在编译器生成的代码方面是“不同的”?(或者换句话说:除了访问权限检查之外,编译器是否对它进行了不同的处理?)

这与以下问题相同:以下代码会导致诸如未定义行为之类的问题吗?(前提是它在不同的单元中编译,有或没有定义X,然后链接在一起。)

class MyClass {
public:
    void foo();

#ifdef X
private:
#endif
    void bar();

private:
    int member;
};

我对独立于编译器的答案以及特定于 GCC 的答案感兴趣(因为这是我的主要目标编译器)。

package private如果我们想通过在“包”中定义一个特定的宏来“模拟”诸如 C++ 中的 Java 世界之类的东西,这将变得很有趣。

4

2 回答 2

4

违反单一定义规则绝对是未定义的行为,该规则要求同一类类型的所有定义都相同。

请注意,类的内存布局仅在每个访问级别中指定,因此更改访问级别可以非常现实地导致类的不同内存布局。

于 2012-09-27T21:11:40.387 回答
1

这似乎不是一个好主意:

更改对某些功能或数据成员的访问权限,例如从私有更改为公共。对于某些编译器,此信息可能是签名的一部分。如果您需要使私有函数受保护甚至公开,则必须添加一个调用私有函数的新函数。

C++ 的策略/二进制兼容性问题

但是,我认为这不应该导致未定义的行为,而是应该导致链接错误或符号加载错误。

更新:

在 GCC (4.6.1) 上进行测试,更改访问权限没有问题。

于 2012-09-27T20:36:18.200 回答