Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;子类作为方法的参数_C++_Class_Parameters_Subclass - Fatal编程技术网

C++ c++;子类作为方法的参数

C++ c++;子类作为方法的参数,c++,class,parameters,subclass,C++,Class,Parameters,Subclass,我想写两个类,在超类中,我需要方法witch作为参数,它有一个子类,如下面的示例代码所示: class class1 { int a; void print(class2 k) { cout<<k.b*a; } }; class class2 :public class1 { public: int b; }; class1类 { INTA; 作废打印(2类k) { 不能使用前向声明并将实现移到类之外: clas

我想写两个类,在超类中,我需要方法witch作为参数,它有一个子类,如下面的示例代码所示:

class class1
{
    int a;
    void print(class2 k)
    {
        cout<<k.b*a;
    }  
};

class class2 :public class1
{
    public:
    int b;
};
class1类
{
INTA;
作废打印(2类k)
{

不能使用前向声明并将实现移到
类之外

class class2;
class class1
{
    int a;
    void print(class2 k);
};

class class2 :public class1
{
    public:
    int b;
};
您无法保持方法内联,因为您需要
class2
的完整类型,而此时该类型不可用

但这里的主要问题是设计,这是错误的。为什么基类需要知道派生类中的方法,而更多的是调用这些方法?

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;
}  
一班 { INTA; 内联void print(class2&k);//按引用传递,但在编译器完全了解class2之后实现。 }; 类别2:公共类别1 { 公众: int b; }; 无效类别1::打印(类别2和k) {
cout解决问题的一个可能方法不是在基类中实现
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;
}

当然,这可能对您想要做的事情没有帮助,但我认为这通常是解决您描述的问题的更好的方法。

我的答案是错误的。我不知道在转发声明后您可以通过值传递。太好了!@Andrew我第一次确实有过疑问。非常感谢,我尝试过类似的方法,但感到困惑并继续犯错误;-)。为什么按引用传递?我的意思是你可以,但你不必。因为编译器在看到原型时必须至少知道参数wq的大小,而对于
class2
它不能知道。但是它可以作为引用
class2&
或指针
class2*
。这是错误的,你只能用一个f来传递值orward声明。见我的答案。你真的想通过值传递这个东西吗?@johndilling我认为更好的问题是“你真的想将派生类传递给基类吗?”这是一个更好的问题,但你已经在回答中问过了。:)
class2 c2;
c2.b = 20; // for example
c2.print()