我想写两个类,在超类中我需要方法女巫作为参数有一个像这个示例代码中的子类:
class class1
{
int a;
void print(class2 k)
{
cout<<k.b*a;
}
};
class class2 :public class1
{
public:
int b;
};
不幸的是,这是不对的 ;-) 我无法弄清楚,有人可以帮忙吗?
我想写两个类,在超类中我需要方法女巫作为参数有一个像这个示例代码中的子类:
class class1
{
int a;
void print(class2 k)
{
cout<<k.b*a;
}
};
class class2 :public class1
{
public:
int b;
};
不幸的是,这是不对的 ;-) 我无法弄清楚,有人可以帮忙吗?
使用前向声明并将实现移出class
:
class class2;
class class1
{
int a;
void print(class2 k);
};
class class2 :public class1
{
public:
int b;
};
您不能保持该方法内联,因为您需要一个class2
此时无法使用的完整类型。
但这里的主要问题是设计,这是错误的。为什么基类需要知道并更多地调用派生类的方法?
class class2;
class class1
{
int a;
inline void print(class2 &k); //pass by reference, but implemented after class2 is completely known to the compiler.
};
class class2 :public class1
{
public:
int b;
};
void class1::print(class2 &k)
{
cout<<k.b*a;
}
您的问题的一种可能的解决方案是不在print()
基类中实现,而是强制任何继承类使用纯虚函数来实现它。目前,您可能会使用以下方法调用您的代码:
class2 c2;
c2.b = 20; // for example
class1 c1;
c1.print( c2 );
但也许实现这一点的更好方法如下:
class class1
{
protected:
int a;
public:
virtual void print() const = 0;
};
class class2 : public class1
{
public:
int b;
void print() const;
};
void class2::print() const
{
cout << b * a;
}
所以现在class2
有义务实现打印功能,这在某种意义上是正确的,因为class2
应该知道class1
但反之则不然。现在你可以这样做:
class2 c2;
c2.b = 20; // for example
c2.print()
当然,这可能无法帮助您完成您想做的事情,但我认为这通常是解决您描述的问题的更好方法。