64,654
社区成员
发帖
与我相关
我的任务
分享
class A;
namespace ns
{
class B;
}
void fun2(A & a);
void fun1(ns::B & b);
void fun4(A * pa);
void fun3(ns::B *pb);
void fun2(A & a)
{
;
}
void fun1(ns::B & b)
{
fun2( b );
}
void fun4(A * pa)
{
;
}
void fun3(ns::B * pb)
{
fun4( pb );
}
class A
{
public:
A(){ ; }
};
namespace ns
{
class B : public A
{
public:
B(){ ; }
};
}
int
main(int argc, char ** argv)
{
ns::B b;
fun1( b );
fun3( &b );
}
class A
{
public:
A(){ ; }
};
namespace ns
{
class B : public A
{
public:
B(){ ; }
};
}
void fun2(A & a);
void fun1(ns::B & b);
void fun4(A * pa);
void fun3(ns::B *pb);
void fun2(A & a)
{
;
}
void fun1(ns::B & b)
{
fun2(b);
}
void fun4(A * pa)
{
;
}
void fun3(ns::B * pb)
{
fun4(pb);
}
int
main(int argc, char ** argv)
{
ns::B b;
fun1(b);
fun3(&b);
}
class A;//前向声明
class C;//前向声明
class D;//前向声明
void fun1(A & a);//用于声明函数时,以上前向声明有效
void fun2(C & c);//用于声明函数时,以上前向声明有效
void fun3(A * pa);//用于声明函数时,以上前向声明有效
void fun4(C * pc);//用于声明函数时,以上前向声明有效
void fun1(A & a){ ; }
void fun2(C & c){ fun1(c); }//用于定义函数时,以上前向声明无效;
//error C2664: “fun2”: 不能将参数 1 从“C”转换为“A &”;
//必须把类A和派生类C的定义均放在前,函数定义的类型才能转换
void fun3(A * pa){ ; }
void fun4(C * pc){ fun3(pc); }//用于定义函数时,以上前向声明无效:
//error C2664: “fun4”: 不能将参数 1 从“C *”转换为“A *”;
//必须把类A和派生类C的定义均放在前,函数定义的类型才能转换
A * pa; //用于声明一个变量类型时,以上前向声明有效
C * pc; //用于声明一个变量类型时,以上前向声明有效
class C : public A //用于派生新类时,以上前向声明无效,error C2504: “A”: 未定义基类;
{ //类A的定义必须在前,才能由类A派生子类C
public:
C(){ ; }
D * pd; //用于声明一个变量类型时,以上前向声明有效
void fun(){ C * pc = pd; }//用于定义函数时,以上前向声明无效:
//error C2440: “初始化”: 无法从“D *”转换为“C *”
///必须把类C和派生类D的定义均放在前,函数定义的类型才能转换
};
class A
{
public:
A(){ ; }
};
class D : public C
{
public:
D(){ ; }
C * pc;
};
int
main(int argc, char ** argv)
{
return 0;
}
//总结:前向声明只对变量的类型声明有效,对函数定义执行代码的变量类型转换无效;
//所以前向声明一般只能在.h头文件中,而在.cpp执行文件头必须包含类的具体内容声明及继承关系的头文件
class A;//前向声明
class C;//前向声明
class D;//前向声明
void fun1(A & a);//用于声明函数时,以上前向声明有效
void fun2(C & c);//用于声明函数时,以上前向声明有效
void fun3(A * pa);//用于声明函数时,以上前向声明有效
void fun4(C * pc);//用于声明函数时,以上前向声明有效
void fun1(A & a){ ; }
void fun2(C & c){ fun1(c); }//用于定义函数时,以上前向声明无效;error C2664: “fun2”: 不能将参数 1 从“C”转换为“A &”;
//必须把类A和派生类C的定义均放在前,函数定义的类型才能转换
void fun3(A * pa){ ; }
void fun4(C * pc){ fun3(pc); }//用于定义函数时,以上前向声明无效:error C2664: “fun4”: 不能将参数 1 从“C *”转换为“A *”;
//必须把类A和派生类C的定义均放在前,函数定义的类型才能转换
class C : public A //用于派生新类时,以上前向声明无效,error C2504: “A”: 未定义基类;
{ //类A的定义必须在前,才能由类A派生子类C
public:
C(){ ; }
D * pd; //用于声明一个变量类型时,以上前向声明有效
};
class A
{
public:
A(){ ; }
};
class D : public C
{
public:
D(){ ; }
C * pc;
};
int
main(int argc, char ** argv)
{
return 0;
}