作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
#include<iostream>
using namespace std;
class A{
public:
class B{
public:
void fun1();
};
};
class C:public A{
public:
B::fun1(){ // This line gives Error:can not define member function B::fun1() in C
}
};
int main(){
C ob;
return 0;
}
有什么方法可以在派生类中定义内部类成员吗?这个错误背后的原因是什么?
最佳答案
问题是您试图在与声明函数的类范围不同的类范围内定义函数。例如,考虑您代码的这个扩展版本:
class A{
public:
class B{
public:
void fun1();
void fun2();
};
void fun3();
void B::fun2() {} // Error.
};
class C:public A{
public:
void B::fun1() {} // Error.
void A::fun3() {} // Error.
};
所有三个错误都会给出相同类型的错误消息,“无法在 Z 中定义成员函数 X::Y()
”。
为了解决这个问题,如果A::B::fun1()
和C::B::fun1()
需要有不同的实现,你可以推导来自嵌套类。
class A {
public:
class AB_ {
public:
virtual void fun1();
};
typedef AB_ B;
};
void A::AB_::fun1() {}
class C : public A {
public:
class CB_ : public A::AB_ {
void fun1() override;
};
typedef CB_ B;
};
void C::CB_::fun1() {}
在这种情况下,您可以在外部使用 B
来访问嵌套类的最派生版本,或者使用 A::AB_
或 C: :CB_
直接。同样,你可以这样写:
class A {
class AB_ {
public:
virtual void fun1();
} b;
public:
typedef AB_ B;
virtual B& getB() { return b; }
};
void A::AB_::fun1() {}
class C : public A {
// Note the use of the typedef, instead of the actual type name.
class CB_ : public A::B {
void fun1() override;
} cb;
public:
typedef CB_ B;
// Note the use of the typedef, instead of the actual type name.
A::B& getB() override { return cb; }
};
void C::CB_::fun1() {}
在这种情况下,C
内部使用了 A
的 typedef,同时替换了它;因此,A
的 typedef 的使用是显式的,如 A::B
而不是 B
。由于类型定义,名称 B
将表示 A::AB_
或 C::CB_
,当用作 A 时: :B
或 C::B
。
// If given the above...
int main() {
std::cout << "A::B: " << typeid(A::B).name() << std::endl;
std::cout << "C::B: " << typeid(C::B).name() << std::endl;
}
输出将是:
// GCC:
A::B: N1A3AB_E
C::B: N1C3CB_E
// MSVC:
A::B: class A::AB_
C::B: class C::CB_
关于c++ - 如何在派生类中定义内部类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110286/
我是一名优秀的程序员,十分优秀!