我读了这个问题并认为如果有人可以写的话很容易解决(不是没有它可以解决):
@Override
public String toString() {
return super.super.toString();
}
Run Code Online (Sandbox Code Playgroud)
我不确定它在许多情况下是否有用,但我想知道为什么它不是,如果这样的东西存在于其他语言中.
你们有什么感想?
编辑: 澄清:是的,我知道,这在Java中是不可能的,我不会真的错过它.这不是我期望的工作,并且惊讶于编译错误.我刚才有了这个想法并想讨论它.
假设我有课程Foo并Bar设置如下:
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++中是否可行?
我有两个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中做这个基本的事情.
如何从派生类对象中调用派生类重写的基类方法?
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) 当使用派生类的对象访问"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)
如何在派生类中访问具有相同名称的方法的基类方法.生成的错误已显示.如果我不清楚,我道歉,但我觉得我已经把自己弄清楚了.提前致谢.
我有一个类层次结构,其工作方式大致如下:
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) 考虑一个简单的继承类:
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
假设基类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) 我有一个主窗口的应用程序,我在其中创建一个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()但我也没有得到它的工作原理 - 比如,如果事件来自第二个窗口,那么这样做,否则,继续做你以前做过的事情 …
我在多态类和继承方面遇到了麻烦。
我有一个父类
//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::calibrate和Automatic::config来自Calibrate::init()?
我试过了:
void Calibrate::init(){ …Run Code Online (Sandbox Code Playgroud) c++ ×7
inheritance ×4
java ×2
clang++ ×1
g++ ×1
methods ×1
overriding ×1
polymorphism ×1
protected ×1
qt ×1
superclass ×1