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

C++ 当只有派生类知道成员变量的大小时,如何在基类函数中使用成员变量

C++ 当只有派生类知道成员变量的大小时,如何在基类函数中使用成员变量,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,我想在使用其派生类成员的基类中实现一个函数。因此,对于每个DerivedClass,我都会有一个不同值的成员。 这里有一个例子。BaseClass具有成员函数Foo(),该函数使用变量arrStr。然而,这个以NUL结尾的字符数组的内容只能在派生类中找到。 在不知道变量大小的情况下,如何使BaseClass知道变量arrStr?这可能吗 class BaseClass { public: BaseClass(); ~BaseClass();

我想在使用其派生类成员的基类中实现一个函数。因此,对于每个DerivedClass,我都会有一个不同值的成员。 这里有一个例子。
BaseClass
具有成员函数
Foo()
,该函数使用变量
arrStr
。然而,这个以NUL结尾的字符数组的内容只能在派生类中找到。 在不知道变量大小的情况下,如何使
BaseClass
知道变量
arrStr
?这可能吗

    class BaseClass
    {
    public:
        BaseClass();
        ~BaseClass();

    protected:

    void Foo()
    {
     prtinf("%s\n", arrStr);
    };

    };

    class DerivedClass : public BaseClass
        {
        public:
            DerivedClass();
            ~DerivedClass();

            protected:

            char arrStr[] = "FooString!";
     };
在派生类中实现的基类中添加(纯)虚拟访问函数

#include <iostream>
#include <string>

class BaseClass
{
protected:
    void Foo()
    {
        std::cout << GetString() << std::endl;
    }

private:    
    virtual std::string GetString() const = 0;
};

class DerivedClass : public BaseClass
{
private:
    virtual std::string GetString() const override
    {
        return "FooString!";
    }
};
#包括
#包括
类基类
{
受保护的:
void Foo()
{
标准::cout
我如何让基类“知道”变量arrStr而不知道其大小?这可能吗

    class BaseClass
    {
    public:
        BaseClass();
        ~BaseClass();

    protected:

    void Foo()
    {
     prtinf("%s\n", arrStr);
    };

    };

    class DerivedClass : public BaseClass
        {
        public:
            DerivedClass();
            ~DerivedClass();

            protected:

            char arrStr[] = "FooString!";
     };
调用Foo时将其作为参数插入:

class BaseClass
{
public:
    virtual void Process() = 0;
protected:
    void Foo(char* str) // <-- value inserted here as parameter
    {
        prtinf("%s\n", arrStr);
    }
};

class DerivedClass : public BaseClass
{
public:
    void Process() override
    {
        Foo(arrStr); // call in derived class, with derived value
    }
protected:
    char arrStr[] = "FooString!";
};

基类了解派生类的详细信息是一个设计问题。但是,您可以在基类中声明和使用虚拟函数,并在派生类中实现它们。虽然没有足够的信息来确定您真正要解决的问题。谢谢!但是,对于派生类,我希望消除我的开销因为每个派生类都有相同的
Foo
函数实现。Make
Foo()
调用(a)私有虚拟函数,即在派生类中实现。为什么不在基类中存储一个指针或引用?您测量的开销是多少?@UlrichEckhardt,当然,谢谢。这就是我要找的。我没有测量开销,可能编译器无论如何都会对此进行优化。我只是不想要s的三个实现ame函数。
GetString()
可以而且可能应该是私有的。但无论如何+1……它也可能是
const
。同意这两个注释。已编辑。