Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++_Inheritance - Fatal编程技术网

继承类对象C++的类构造函数

继承类对象C++的类构造函数,c++,inheritance,C++,Inheritance,您好,我不知道如何为从point类继承的rectangle类创建构造函数。我想让矩形的构造函数接受类point的对象,它在/**/注释中 class point { double x_, y_, z_; public: point(const double& a1 = 0, const double& a2 = 0, const double& a3 = 0) { x_ = a1; y_ = a2;

您好,我不知道如何为从point类继承的rectangle类创建构造函数。我想让矩形的构造函数接受类point的对象,它在/**/注释中

class point
{
       double x_, y_, z_;

public:

    point(const double& a1 = 0, const double& a2 = 0, const double& a3 = 0)
    {
        x_ = a1;
        y_ = a2;
        z_ = a3;
    }

    double x() const { return x_; }
    double y() const { return y_; }
    double z() const { return z_; }
    double& x() { return x_; }
    double& y() { return y_; }
    double& z() { return z_; }
};

class rectangle : public point
{
    double a_, b_;

public:
    rectangle(const double& a1 = 0, const double& a2 = 0, const double& a3 = 0, const double& a4 = 0, const double& a5 = 0) : point(a1, a2, a3)
    {
        a_ = a4;
        b_ = a5;
    }

    /*
    rectangle(point p1, const double& a1, const double& a2)
    {
        x_ = p1.x();
        y_ = p1.y();
        z_ = p1.z();
        a_ = a1;
        b_ = a2;
    }
    */
    double& a() { return a_; }
    double& b() { return b_; }
    double a() const { return a_; }
    double b() const { return b_; }
    double field() const { return  a_ * b_; }
};
我还想问一下,我是否能以某种方式融合这两种功能:

double x() const { return x_; }
double& x() { return x_; }
不能在矩形的构造函数中使用x、y和z,因为它们在基类中是私有的。您可以使它们受到保护,也可以简单地使用point类的构造函数:

rectangle(point p1, const double& a1, const double& a2)
: point(p1.x(), p1.y(), p1.z())
{
    a_ = a1;
    b_ = a2;
}
不能在矩形的构造函数中使用x、y和z,因为它们在基类中是私有的。您可以使它们受到保护,也可以简单地使用point类的构造函数:

rectangle(point p1, const double& a1, const double& a2)
: point(p1.x(), p1.y(), p1.z())
{
    a_ = a1;
    b_ = a2;
}

使用初始化列表,就像使用第一个构造函数一样:

rectangle(point p1, const double& a1, const double& a2)
: point(p1.x(), p1.y(), p1.z())
{
    a_ = a1;
    b_ = a2;
}
矩形点p1、常数双精度和a1、常数双精度和a2:点p1 { a=a1; b_=a2; }
使用初始化列表,就像使用第一个构造函数一样:

rectangle(point p1, const double& a1, const double& a2)
: point(p1.x(), p1.y(), p1.z())
{
    a_ = a1;
    b_ = a2;
}
矩形点p1、常数双精度和a1、常数双精度和a2:点p1 { a=a1; b_=a2; } 你可以逍遥法外

rectangle(point p1, const double& a1, const double& a2) : point(p1), a_(a1), b_(a2) {}
若你们并没有其他的构造函数,那个么你们需要添加

point(const point& other) = default; // copy construcor
在这一点上,您还需要查看您可以侥幸逃脱的

rectangle(point p1, const double& a1, const double& a2) : point(p1), a_(a1), b_(a2) {}
若你们并没有其他的构造函数,那个么你们需要添加

point(const point& other) = default; // copy construcor

此时,您还需要查看

,您可以通过以下方式解决此问题:

using Animal::Animal;

在C++双关中有一个使用关键字的构造函数继承。这对我有用

// C++ program to demonstrate inheritance

#include <iostream>
using namespace std;

// base class
class Animal {

public:
     explicit Animal(){
         cout << "Constructor of Animal called";
     }
};

// derived class
class Dog : public Animal {

    using Animal::Animal;

public:

    Dog(){
        cout << "I can bark! Woof woof!!" ;
    }

};

int main() {
 Animal Obj1; // This will invoke the constructor of Animal class
 Dog obj2;    // This will also invoke Constructor of Animal class bcz of Using Keyword

    return 0;
}

您可以通过以下方式解决此问题:

using Animal::Animal;

在C++双关中有一个使用关键字的构造函数继承。这对我有用

// C++ program to demonstrate inheritance

#include <iostream>
using namespace std;

// base class
class Animal {

public:
     explicit Animal(){
         cout << "Constructor of Animal called";
     }
};

// derived class
class Dog : public Animal {

    using Animal::Animal;

public:

    Dog(){
        cout << "I can bark! Woof woof!!" ;
    }

};

int main() {
 Animal Obj1; // This will invoke the constructor of Animal class
 Dog obj2;    // This will also invoke Constructor of Animal class bcz of Using Keyword

    return 0;
}

如果您公开double&x{return x_;},只需公开x以及所有其他成员;这是我的教授要求的,然后将代码更改为p1.x=1;。在这种情况下使用函数没有什么好处。同意@Snakerred,通常,拥有一个接口比直接公开内部属性更好。@AdrianMail通常意味着存在不正确的情况,问题中的情况就是其中之一。如果您公开double&x{return x},只需公开x,以及所有其他成员;这是我的教授要求的,然后将代码更改为p1.x=1;。在这种情况下,使用函数没有什么好处。同意@Snakerred的说法,通常情况下,拥有一个接口比直接公开内部属性更好。@AdrianMail通常意味着存在不正确的情况,问题中的情况就是其中之一。