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

C++ 派生类的基类值的初始化

C++ 派生类的基类值的初始化,c++,inheritance,initialization,C++,Inheritance,Initialization,我想创建基类Foo的ab对象,它将变量值初始化为我决定的值,然后我想创建派生类Bar的对象,我先前决定的变量值与Bar继承的Foo保持一致,类似于对变量值进行一次常量初始化 是否有一种方法可以做到这一点,而不必在每次我创建Bar对象时传入值,就像创建Foo对象一样,或者将类值默认为5 例如: // Base class class Foo { private: int value; public: Foo() {} Foo(int value) : value(value

我想创建基类
Foo
的ab对象,它将变量
值初始化为我决定的值,然后我想创建派生类
Bar
的对象,我先前决定的变量值与
Bar
继承的
Foo
保持一致,类似于对变量值进行一次常量初始化

是否有一种方法可以做到这一点,而不必在每次我创建
Bar
对象时传入值,就像创建
Foo
对象一样,或者将类值默认为5

例如:

// Base class
class Foo {
private:
    int value;
public:
    Foo() {}
    Foo(int value) : value(value) {}
    int getValue() { return value; }
};

// Derived class
class Bar : public Foo {
private:
public:
    Bar() {}
};

Foo foo(5);
foo.getValue() // 5
Bar bar;
bar.getValue() // this I also want to be 5 now 

您可以在类范围或方法范围内使用静态变量来实现这一点(后者有一些不同之处,如延迟初始化、线程安全初始化等。尽管在您的用例中没有太大区别,但最好将后者作为一个选项牢记在心)。比如说

#include <iostream>

using std::cout;
using std::endl;

// Base class
class Foo {
private:
    static int value;
public:
    Foo() {}
    Foo(int value) {
        Foo::value = value;
    }
    int getValue() { return value; }
};

int Foo::value = 0;

// Derived class
class Bar : public Foo {
private:
public:
    Bar() {}
};

int main() {
    Foo foo(5);
    cout << foo.getValue() << endl;
    Bar bar;
    cout << bar.getValue() << endl;
}
#包括
使用std::cout;
使用std::endl;
//基类
福班{
私人:
静态int值;
公众:
Foo(){}
Foo(int值){
Foo::value=value;
}
int getValue(){return value;}
};
intfoo::value=0;
//派生类
分类栏:公共食品{
私人:
公众:
Bar(){}
};
int main(){
富富(5),;

cout您可以在类范围或方法范围内使用静态变量来实现这一点(后者有一些不同之处,如惰性初始化、线程安全初始化等。尽管这对您的用例没有太大的影响,但最好将后者作为一个选项记在心里)

#include <iostream>

using std::cout;
using std::endl;

// Base class
class Foo {
private:
    static int value;
public:
    Foo() {}
    Foo(int value) {
        Foo::value = value;
    }
    int getValue() { return value; }
};

int Foo::value = 0;

// Derived class
class Bar : public Foo {
private:
public:
    Bar() {}
};

int main() {
    Foo foo(5);
    cout << foo.getValue() << endl;
    Bar bar;
    cout << bar.getValue() << endl;
}
#包括
使用std::cout;
使用std::endl;
//基类
福班{
私人:
静态int值;
公众:
Foo(){}
Foo(int值){
Foo::value=value;
}
int getValue(){return value;}
};
intfoo::value=0;
//派生类
分类栏:公共食品{
私人:
公众:
Bar(){}
};
int main(){
富富(5),;

如果我正确理解了您的目标,那么它似乎注定要失败。您不是从基类的对象/实例继承的,而是从基类继承的,该类不知道现有对象的成员变量的值。是否存储对您尝试“继承”的对象的引用帮助实现您想要的?您的需求是在基类构造中实现一个副作用,它会影响所有后续派生类构造。至少可以这么说,这是令人困惑的。以面向对象的方式这样做是可能的。您可以编写一个工厂类,其中构造函数接受变量值。创建对象工厂将使用此值创建。如果我正确理解您的目标,它似乎注定要失败。您不是从基类的对象/实例继承,而是从基类继承,该类不知道现有对象的成员变量的值。是否存储对您尝试“继承”的对象的引用帮助实现您想要的?您的需求是在基类构造中实现一个副作用,它会影响所有后续派生类构造。至少可以这么说,这是令人困惑的。以面向对象的方式这样做是可能的。您可以编写一个工厂类,其中构造函数接受变量值。创建对象将使用此值创建由工厂创建的。