消息关闭
    暂无新消息!
现有类层次如下

//////////////////////////////////
a.h文件:-----------

class A
{
.....
A(){ ; }
};

//////////////////////////////////
b.h文件-----------

#include "a.h"

namespace  SP
{  
class B : public A
 {
..........
B(){ ; }
}; 
}

/////////////////////////////////////
c.h文件-----------

#include "a.h"

namespace  SP
{
    class B;//前向声明class B 
}

void fun1(SP::B * pb);
void fun2( A * pa);

/////////////////////////////////
c.cpp文件
#include "c.h"

void fun1(SP::B * pb);
{
     fun2(pb);   //编译错误:error C2664: “fun2”: 不能将参数 1 从“SP::B * ”转换为“ A * ” 与指向的类型无关;
....................
}

void fun2( A * pa)
{
.........
}

/////////////////////////////////
main.cpp文件
#include "a.h"
#include "b.h"
#include "c.h"
............................

在命名空间中的类从继承于外部类,并进行前向声明,在运行代码中无法将派生类SP::B指针转换为基类A的指针。如果把SP::B类的全部头文件c.h文件包含,就可以编译通过。
问题是:不包含头文件,只前向声明,如何实现?

3个回答

︿ 2
在命名空间中的类从继承于外部类
    
namespace  SP
{  
class B : public A
 {
..........
B(){ ; }
}; 
}
 

前向声明出现编译错误:B* 无法转换为A*
︿ 0
仅有前置声明,看不到定义,那编译器如何知道B* 可以隐式装换为 A*?那你函数中也用不了它们的成员了啊

你试试强制转换fun2((A*)pb);
︿ 0
struct A {} ;

struct B ;

void func2 (A &a) {

}

void func1 (B &) ;

struct B :public A {} ;

void func1 (B &a) {
func2 (a) ;
}