如何在基类函数中使用只有派生类知道其大小的成员变量

How to use a member variable in a base class function when its size is only known to the derived class

本文关键字:变量 成员 派生 基类 类函数      更新时间:2023-10-16

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

    class BaseClass
    {
    public:
        BaseClass();
        ~BaseClass();
    protected:
    void Foo()
    {
     prtinf("%sn", 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!";
    }
};

现场演示

我如何使BaseClass"知道"变量arrStr而不知道它的大小?这可能吗?

在调用Foo:

时将其作为参数插入
class BaseClass
{
public:
    virtual void Process() = 0;
protected:
    void Foo(char* str) // <-- value inserted here as parameter
    {
        prtinf("%sn", arrStr);
    }
};
class DerivedClass : public BaseClass
{
public:
    void Process() override
    {
        Foo(arrStr); // call in derived class, with derived value
    }
protected:
    char arrStr[] = "FooString!";
};
客户机代码:

BaseClass * b = new DerivedClass;
b->Process(); // call Foo(arrStr) internally