相关疑难解决方法(0)

为什么是super.super.method(); Java不允许?

我读了这个问题并认为如果有人可以写的话很容易解决(不是没有它可以解决):

@Override
public String toString() {
    return super.super.toString();
}
Run Code Online (Sandbox Code Playgroud)

我不确定它在许多情况下是否有用,但我想知道为什么它不是,如果这样的东西存在于其他语言中.

你们有什么感想?

编辑: 澄清:是的,我知道,这在Java中是不可能的,我不会真的错过它.这不是我期望的工作,并且惊讶于编译错误.我刚才有了这个想法并想讨论它.

java superclass

347
推荐指数
7
解决办法
16万
查看次数

如果我要覆盖它,我可以调用基类的虚函数吗?

假设我有课程FooBar设置如下:

class Foo
{
public:
    int x;

    virtual void printStuff()
    {
        std::cout << x << std::endl;
    }
};

class Bar : public Foo
{
public:
    int y;

    void printStuff()
    {
        // I would like to call Foo.printStuff() here...
        std::cout << y << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

正如在代码中注释的那样,我希望能够调用我所覆盖的基类函数.在Java中有super.funcname()语法.这在C++中是否可行?

c++ overriding virtual-functions

315
推荐指数
5
解决办法
22万
查看次数

在Java中,如何从派生类中的重写方法调用基类的方法?

我有两个Java类:B,它扩展了另一个类A,如下所示:

class A {
    public void myMethod() { /* ... */ }
}

class B extends A {
    public void myMethod() { /* Another code */ }
}
Run Code Online (Sandbox Code Playgroud)

我想打电话A.myMethod()B.myMethod().我来自C++世界,我不知道如何在Java中做这个基本的事情.

java methods polymorphism inheritance

130
推荐指数
6
解决办法
24万
查看次数

从派生类对象调用基类方法

如何从派生类对象中调用派生类重写的基类方法?

class Base{
  public:
    void foo(){cout<<"base";}
};

class Derived:public Base{
  public:
    void foo(){cout<<"derived";}
}

int main(){
  Derived bar;
  //call Base::foo() from bar here?
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

36
推荐指数
2
解决办法
7万
查看次数

使用派生类的对象访问基类的方法,该对象具有相同名称的方法

当使用派生类的对象访问"base"的foo()时.

#include <iostream>

class  base
{
      public:
      void foo()
     {
        std::cout<<"\nHello from foo\n";
     }
};

class derived : public base
{
     public:
     void foo(int k)
     {
        std::cout<<"\nHello from foo with value = "<<k<<"\n";
     }
};
int main()
{
      derived d;
      d.foo();//error:no matching for derived::foo()
      d.foo(10);

}
Run Code Online (Sandbox Code Playgroud)

如何在派生类中访问具有相同名称的方法的基类方法.生成的错误已显示.如果我不清楚,我道歉,但我觉得我已经把自己弄清楚了.提前致谢.

c++ inheritance

9
推荐指数
2
解决办法
8237
查看次数

隐藏私有的重载虚拟功能?

我有一个类层次结构,其工作方式大致如下:

class A 
{ 
protected: 
    virtual void f(int) = 0;
};

class B 
{ 
protected: 
    virtual void f(char*) = 0;
};

class DA : A 
{ 
private:
    virtual void f(int) override {}
};

class DB : public DA, B 
{ 
private:
    virtual void f(char*) override {}
};
Run Code Online (Sandbox Code Playgroud)

当我尝试使用clang(或gcc,就此问题)编译时,它会给我警告

<source>:22:18: warning: 'DB::f' hides overloaded virtual function [-Woverloaded-virtual]
    virtual void f(char*) override {}
                 ^
<source>:16:18: note: hidden overloaded virtual function 'DA::f' declared here: type mismatch at 1st parameter ('int' vs 'char *') …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance g++ clang++

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

C++扩展了继承的函数

考虑一个简单的继承类:

class Base 
{
  void func() {
     cout << "base" << endl;
  }
};

class Derived : public Base
{
  void func() {
      cout << "derived" << endl;
  } 
};
Run Code Online (Sandbox Code Playgroud)

如果我运行Derived :: func()我得到

derived
Run Code Online (Sandbox Code Playgroud)

我想修改这段代码来获取

base
derived
Run Code Online (Sandbox Code Playgroud)

类似于扩展而不是覆盖的东西.

我已经能够获得类似于构造函数的东西,但是没有正常的函数.

非常感谢Lucio

c++

6
推荐指数
2
解决办法
1万
查看次数

派生类如何使用基类的受保护成员?

假设基类A定义了一个受保护的成员。派生类B使用此成员。

class A
{
public:
  A(int v) : value(v) { }

protected:
  int value;
};

class B : public A
{
public:
  B(int v) : A(v) { }
  void print() const;
  void compare_and_print(const A& other) const;
};
Run Code Online (Sandbox Code Playgroud)

该函数B::print只获取当前成员的值并打印它:

void B::print() const
{
  std::cout << "Value: " << value << "\n";
}
Run Code Online (Sandbox Code Playgroud)

另一个成员函数 ,B::compare_and_print采用 的实例A,检查它们的值并打印两者的最大值:

void B::compare_and_print(const A& other) const
{
  auto max_value = std::max(value, other.value);
  std::cout << "Max value: " …
Run Code Online (Sandbox Code Playgroud)

c++ protected private-members

5
推荐指数
1
解决办法
649
查看次数

在两对QGraphicsScene/QGraphicsView之间拖放QGraphicsItem

我有一个主窗口的应用程序,我在其中创建一个QGraphicsScene,如下所示:

DiagramWindow::DiagramWindow()
{
    scene = new QGraphicsScene(0, 0, 600, 500);
Run Code Online (Sandbox Code Playgroud)

然后在同一个程序中,我用另一个(不同的)QGraphicsScene 调用另一个窗口.这两个场景都有各自的QGraphicsViews,我使用相同的自定义类在每个场景/窗口中绘制QGraphicsItem.

现在我正在尝试使用这个在两个场景/窗口之间实现拖放,我得到的效果我认为与此SO问题 类似/相同.基本上,当我将QGraphicsItem从第二个窗口/场景拖动到主窗口时,它不会触发场景中的事件,它会在主窗口的工具栏/边框中触发.

我的事件处理功能是:

void DiagramWindow::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "I'm on the main window!";

    event->acceptProposedAction();
}
Run Code Online (Sandbox Code Playgroud)

void DiagramWindow::dropEvent(QDropEvent *event)
{
    event->acceptProposedAction();
    qDebug() << "got a drop!";
}
Run Code Online (Sandbox Code Playgroud)

根据那里的答案,我将不得不setAcceptDrops()在QGraphicsScene(这是不可能的),所以诀窍似乎是超载QGraphicsScene::dragMoveEvent().由于我的QGraphicsScene没有特定的类(仅适用于它的父级DiagramWindow),我不知道如何编写一个函数来定位场景的具体内容dragMoveEvent().

问题1我希望我可以这样做:

DiagramWindow->scene::dragMoveEvent()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

但当然这是不可能的.我是C++/Qt的新手,一般的工作流程/语法动力学仍然让我望而却步.如何在MainWindow中定位QGraphicsScene来编写事件处理函数?

问题2另外,我注意到通过重写这些事件处理函数,我(显然)失去了我在主窗口中的大部分功能 - 选择和移动QGraphicsItems不再有效.反正只有当事件发生在第二个窗口时,我才会触发这些事件?我已经看过了,QDrag->source()但我也没有得到它的工作原理 - 比如,如果事件来自第二个窗口,那么这样做,否则,继续做你以前做过的事情 …

qt drag-and-drop qgraphicsview qgraphicsscene

4
推荐指数
1
解决办法
4508
查看次数

在 C++ 继承中从父调用子方法的最佳方法

我在多态类和继承方面遇到了麻烦。

我有一个父类

//calibration.h 
class Calibration {
private:
public:
void init();
void calc():
void close();
void saveFile();
}

//calibration.cpp
Calibration::Calibration(){}
void Calibration::saveFile(){
std::ofstream out;
    out.open("cores.arff");
out << " " << std::endl;
out.close();
}
Run Code Online (Sandbox Code Playgroud)

我有两个孩子

//automatic.cpp 
Automatic::Automatic(){}
void Automatic::config(){
....
}
void Automatic::calibrate(){
....
}

void Calibrate::init(){
 Automatic::config();
}


//manual.h
#include "calibration.h"
class Manual : public Calibration {
public:
void calibrate();
}


//manual.cpp 
Manual::Manual(){}

void Manual::calibrate(){
....
}

void Calibrate::init(){
 Manual::calibrate();
}
Run Code Online (Sandbox Code Playgroud)

我如何更正呼叫Manual::calibrateAutomatic::config来自Calibrate::init()

我试过了:

void Calibrate::init(){ …
Run Code Online (Sandbox Code Playgroud)

c++

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