Summit
Summit

Reputation: 2258

How can i define a pure abstract base class

I get error when i try to compile this code.

class FunctionVisitor
{
public:
    virtual ~FunctionVisitor() = default;
    virtual void visit(SumTimer&) = 0;
    virtual void visit(SumSelector&) = 0;
};


class timerVisitor : public FunctionVisitor
{
private:
    std::string variableName;
    std::string variableValue;
public:
    timerVisitor(std::string varName, std::string varValue) : variableName(varName), variableValue(varValue) { }
    virtual void visit(SumTimer& fun) override;
};

class selectorVisitor : public FunctionVisitor
{
private:
    std::string variableName;
    std::string variableValue;
public:
    selectorVisitor(std::string varName, std::string varValue) : variableName(varName), variableValue(varValue) { }
    virtual void visit(SumSelector& sel) override;
};

The reason is that i have pure virtual functions in the base class but each sub class only has defination of one function of the base class virtual function.

Can i have pure virtual functions in this case ?

Upvotes: 0

Views: 82

Answers (2)

What do you want to happen if you call a different function? E.g. if you call visit(SumSelector&) on a timerVisitor?

@user253751 i don't want any action in that case.

If you don't want anything to happen when the function is called but not overridden, then make the base class have a function that does nothing. Instead of

virtual void visit(SumTimer&) = 0;

write:

virtual void visit(SumTimer&) {}

Pure virtual (= 0) means that you want to force derived classes to override the function. If you don't want to do that, then don't make them pure virtual!

Upvotes: 1

SzymonO
SzymonO

Reputation: 596

Every class that inherits from abstract class in c++ and doesn't override all of its pure virtual functions is considered abstract and cannot be instantiated neither locally nor dynamically. You can either override the functions to do nothing (or return an exception)

virtual void visit(SumTimer& fun) override {}

or make the abstract class concrete and the functions do nothing by default

class FunctionVisitor
{
public:
    virtual ~FunctionVisitor() = default;
    virtual void visit(SumTimer&) {}
    virtual void visit(SumSelector&) {}
};

Upvotes: 1

Related Questions