相关疑难解决方法(0)

为什么我应该使用"using"关键字来访问我的基类方法?

我写下面的代码是为了解释我的问题.如果我注释第11行(使用关键字"using"),编译器不会编译该文件并显示以下错误:invalid conversion from 'char' to 'const char*'.它似乎没有void action(char)Parent类中看到Son类的方法.

为什么编译器会以这种方式运行?或者我做错了什么?

class Parent
{
    public:
        virtual void action( const char how ){ this->action( &how ); }
        virtual void action( const char * how ) = 0;
};

class Son : public Parent
{
    public:
        using Parent::action; // Why should i write this line?
        void action( const char * how ){ printf( "Action: %c\n", *how ); }
};

int main( int argc, char** argv ) …
Run Code Online (Sandbox Code Playgroud)

c++ oop inheritance using

66
推荐指数
4
解决办法
4万
查看次数

45
推荐指数
5
解决办法
25万
查看次数

重载虚函数集的部分继承

我以为我理解了继承,虚函数和函数重载,但我有一个案例,其中有关于这些特性之间的相互作用的事情让我望而却步.

假设我有一个包含重载虚函数的简单基类,以及从中派生的第二个类:

class b {
 public:
    virtual int f() { return 1; }
    virtual int f(int) { return 2; }
};


class d : public b {
 public:
    virtual int f(int) { return 3; }
};
Run Code Online (Sandbox Code Playgroud)

请注意,派生类d仅覆盖其中一个重载的虚函数.

我可以实例化一个类的对象df(int)在其上调用,没问题:

d x;
std::cout << x.f(0) << std::endl;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试调用0参数函数时:

std::cout << x.f() << std::endl;
Run Code Online (Sandbox Code Playgroud)

它失败!gcc说"没有匹配函数来调用'd :: f()';候选者是:virtual int d :: f(int)".clang说"函数调用的参数太少,预期为1,有0;你的意思是'b :: f'吗?" 即使d派生出来的b是0-argument f()方法,编译器也会忽略它,并试图调用d1-argument方法.

我可以通过重复派生类中的0参数函数的定义来解决这个问题:

class d : public …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance virtual-functions overloading

9
推荐指数
1
解决办法
858
查看次数

调用基类的重载方法

我有这个代码:

#include <iostream>
#include <string>

using namespace std;

class A {
    public: void Print(int i) {cout<<i;}
};

class B : public A {
    public: void Print(string s) {cout<<s;}
};

int main() {
    B bInstance;
    bInstance.Print(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

error: invalid conversion from 'int' to 'const char*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

这意味着它试图在不考虑继承过载的情况下调用B的Print.但是,A的打印应该可以由B实例调用.事实上,如果我将呼叫改为

bInstance.A::Print(1);
Run Code Online (Sandbox Code Playgroud)

然后它编译没有任何错误,但我想避免每次都要编写类范围操作符.有没有办法告诉编译器我试图调用基类的函数重载?

c++ methods inheritance overloading class

7
推荐指数
1
解决办法
6801
查看次数

函数重载的c ++问题

我有功能重载的问题.我将向您展示一些简单的例子:

class A {};
class B : public A{};

void somefunction(A&, A&);
void somefunction(B&, B&);

void someotherfunction() {
...
A& a1 = ...
A& a2 = ...

...
}
Run Code Online (Sandbox Code Playgroud)

a1和a2都是B的实例

somefunction(a1,a2);
Run Code Online (Sandbox Code Playgroud)

电话

void somefunction(A&, A&);
Run Code Online (Sandbox Code Playgroud)

我做错了什么?我的意思是多态性和重载是这样的东西,不是吗?

编辑:好的,现在我知道它不起作用(感谢您的答案).

任何解决方案如何做到这一点?没有铸造.

edit2:好吧保持原样,使用类型转换,因为我想要的东西是不可能的.感谢你的帮助.

c++ polymorphism overloading

3
推荐指数
1
解决办法
4155
查看次数